Sistemas de Inferencia difusos
(Fuzzy Inference Systems o FIS)
Componentes de un sistema de inferencia difuso
- Base de reglas
- Base de datos (funciones de mebresía)
- Mecanismo de razonamiento
Normalmente si los valores a disposición son números que se quieren procesar en un sistema de inferencia difuso procedemos a implementar una etapa de fusificación y una etapa de defusificación.
Un sistema de inferencia difuso puede abstraerse en el sigueinte diagrama (tomado de Jhy).
Sistemas de inferencia difusos: Mamdani y Sugeno
Mamdani
- intuitivo
- Adecuado para entrada con interpretacion
- Base de reglas interpretable
- Tiene un ambplia aceptación
Sugeno
- Computacionalmente eficiente
- Trabaja bien con tecicas lineales (control PID)
- Trabaja bien con tecnicas optimización y adaptación
- Garantiza la continuidad de la superficie de salida
- Adecuado para le analisis matematico
MATLAB Tollbox
Ejemplo: Propina (Gráfico) tipo Mamdani
Se crea un sistema de inferencia difusa Mamdani utilizando un problema de propina de dos entradas y una salida basado en las prácticas de propina en los EE. UU. Si bien el ejemplo crea un Mamdani FIS (Sistema de inferencia disfuso), los métodos utilizados también se aplican a la creación de sistemas Sugeno.
Dado un número entre 0 y 10 que representa la calidad del servicio en un restaurante (donde 10 es excelente), y otro número entre 0 y 10 que representa la calidad de la comida en ese restaurante (nuevamente, 10 es excelente), ¿Cuál debería ser la propina?
El punto de partida es escribir las reglas de las propinas:
- Si el servicio es deficiente o la comida rancia, entonces la propina es barata.
- Si el servicio es bueno, entonces la propina es normal.
- Si el servicio es excelente o la comida es deliciosa, entonces la propina es generosa.
Suponga que una propina promedio es del 15%, una propina generosa es del 25% y una propina barata es del 5%. En lugar de asignar alguno de estos tres valores, obtendremos una curva de valores dependiendo de cual regla es la que domina.
El proceso de inferecnia se muestra en el sigueinte diagrama.
Las partes de un sistemas de inferencnia difuso
- Fusifiación de las variables de entrada
- Apicación de las operaciones difusas (AND, OR, NOT) en el antecedente
- Implicación del antecedente al consecuente
- Agregacion de todas consecuencias de las reglas
- Defusificación
Fusifiación de las entradas
- Para cada entrada en el espacio de discurso se aplica la funcion de membresia requerida por las reglas
- La entrada es un elemento del universo de discurso (un valor numerico especifico), en este caso un numero en

- La salida es un grado de mebresia (entre 0 y 1) al conjunto lingüístico calificativo
En este caso se tendrian que realizar 5 evaluaciones en la fucines demenbresia correspondientes de acuerdo a las reglas especificadas. Por ejemplo un aevaluación es:
Aplicacion de operaciones difusas
- Se aplican las operaciones de las reglas con las T-normas y las S-normas definidas para AND u OR respectivamente
- La salidas de cada antecedente es un conjunto difuso contante (un numero)
En este caso tendriamos que evaluar tres antecedentes. Por ejemplo para el caso de la evaluación del antecedente de la regla tres (suponiendo las funciones de membresia, y los calores de entrada dados) se tendría
Método de implicación
Una vez asignada la ponderación adecuada a cada regla, se implementa el método de implicación. Un consecuente es un conjunto difuso representado por una función de pertenencia, que pondera adecuadamente las características lingüísticas que se le atribuyen. El consecuente se modifica utilizando una función asociada con el antecedente (un solo número). La entrada para el proceso de implicación es un solo número dado por el antecedente y la salida es un conjunto difuso. La implicación se implementa para cada regla. Se admiten dos métodos integrados y son las mismas funciones que utiliza el método AND: min (mínimo), que trunca el conjunto difuso de salida, y prod (producto), que escala el conjunto difuso de salida.
Por ejemlo si se realiza la implicación a la regla tres
Nota: El sistema de inferencia Sugeno siempre implementa la multiplicación como metodo
Agregación de todas las salidas
La decision estar basada en todos los resultados de las reglas del FIS (Sistema de inferencia difuso). La agragción es el porceso mediante el cual todos los cinuntos difusos resultantes de la evaluación delas reglas se ocmbinana en un solo conjunto difuso. La agregación satisface con ser un aoperación comutativa, por lo tanto el orden de las operaciones no afecta el resutado. La agragción es una ioperación dentre conjuntos difusos (max, probor, sum).
Por ejemplo la agregación (con el método máx) de las tres reglas difusas para el ejemplo quedaria como:
Nota: Sugeno siempre utiliza el metodo sum de agregación.
Defusificación
La defusificación convuerte un conjunto dofuso (el conjunto agregado) en un numero. En matlab se soportan 5 metodos diferentes de defusificación: centroide, bisector, media del maxicmo, maximo mas grande, maximo mas chico.
Si se aplica el metodo fe centriode para el ejmplo se tiene
Todo el proceso de inferecnia difusa se puede simplificar en un diagram de inferencia difusa
En particular para el eejmplo
App
fuzzyLogicDesigner('tipper.fis')
Ejemplo: Propina (código) tipo Mamdani
fis = mamfis('Name', 'Propina') % nombre del mamdani
fis =
mamfis with properties:
Name: "Propina"
AndMethod: "min"
OrMethod: "max"
ImplicationMethod: "min"
AggregationMethod: "max"
DefuzzificationMethod: "centroid"
Inputs: [0×0 fisvar]
Outputs: [0×0 fisvar]
Rules: [0×0 fisrule]
DisableStructuralChecks: 0
See 'getTunableSettings' method for parameter optimization.
fis = addInput(fis,[0 10],'Name', 'servicio');
fis = addMF(fis, "servicio", "gaussmf", [1.5 0],'Name', "pobre");
fis = addMF(fis, "servicio", "gaussmf", [1.5 5],'Name', "bueno");
fis = addMF(fis, "servicio", "gaussmf", [1.5 10],'Name', "excelente")
fis =
mamfis with properties:
Name: "Propina"
AndMethod: "min"
OrMethod: "max"
ImplicationMethod: "min"
AggregationMethod: "max"
DefuzzificationMethod: "centroid"
Inputs: [1×1 fisvar]
Outputs: [0×0 fisvar]
Rules: [0×0 fisrule]
DisableStructuralChecks: 0
See 'getTunableSettings' method for parameter optimization.
fis = addInput(fis,[0 10],'Name', 'comida');
fis = addMF(fis, "comida", "trapmf", [-2 0 1 3],'Name', "rancio");
fis = addMF(fis, "comida", "trapmf", [7 9 10 12],'Name', "delicioso")
fis =
mamfis with properties:
Name: "Propina"
AndMethod: "min"
OrMethod: "max"
ImplicationMethod: "min"
AggregationMethod: "max"
DefuzzificationMethod: "centroid"
Inputs: [1×2 fisvar]
Outputs: [0×0 fisvar]
Rules: [0×0 fisrule]
DisableStructuralChecks: 0
See 'getTunableSettings' method for parameter optimization.
fis = addOutput(fis,[0 30],'Name',"propina");
fis = addMF(fis,"propina","trimf",[0 5 10],'Name',"barata");
fis = addMF(fis,"propina","trimf",[10 15 20],'Name',"promedio");
fis = addMF(fis,"propina","trimf",[20 25 30],'Name',"generosa")
fis =
mamfis with properties:
Name: "Propina"
AndMethod: "min"
OrMethod: "max"
ImplicationMethod: "min"
AggregationMethod: "max"
DefuzzificationMethod: "centroid"
Inputs: [1×2 fisvar]
Outputs: [1×1 fisvar]
Rules: [0×0 fisrule]
DisableStructuralChecks: 0
See 'getTunableSettings' method for parameter optimization.
fis = addRule(fis,ruleList)
fis =
mamfis with properties:
Name: "Propina"
AndMethod: "min"
OrMethod: "max"
ImplicationMethod: "min"
AggregationMethod: "max"
DefuzzificationMethod: "centroid"
Inputs: [1×2 fisvar]
Outputs: [1×1 fisvar]
Rules: [1×3 fisrule]
DisableStructuralChecks: 0
See 'getTunableSettings' method for parameter optimization.
fis.Rules
ans =
1×3 fisrule array with properties:
Description
Antecedent
Consequent
Weight
Connection
Details:
Description
_________________________________________________________________
1 "servicio==pobre | comida==rancio => propina=barata (1)"
2 "servicio==bueno => propina=promedio (1)"
3 "servicio==excelente | comida==delicioso => propina=generosa (1)"
Construcción alternativa tipo Mamdani
fis2 = mamfis('Name','propina2');
fis2.Inputs(1).Name = "servicio";
fis2.Inputs(1).Range = [0 10];
fis2.Inputs(1).MembershipFunctions(1) = fismf;
fis2.Inputs(1).MembershipFunctions(1).Name = "pobre";
fis2.Inputs(1).MembershipFunctions(1).Type = "gaussmf";
fis2.Inputs(1).MembershipFunctions(1).Parameters = [1.5 0];
fis2.Inputs(1).MembershipFunctions(2) = fismf;
fis2.Inputs(1).MembershipFunctions(2).Name = "buena";
fis2.Inputs(1).MembershipFunctions(2).Type = "gaussmf";
fis2.Inputs(1).MembershipFunctions(2).Parameters = [1.5 5];
fis2.Inputs(1).MembershipFunctions(3) = fismf;
fis2.Inputs(1).MembershipFunctions(3).Name = "excelente";
fis2.Inputs(1).MembershipFunctions(3).Type = "gaussmf";
fis2.Inputs(1).MembershipFunctions(3).Parameters = [1.5 10];
fis2.Inputs(2) = fisvar([0 10],'Name',"comida");
fis2.Inputs(2).MembershipFunctions(1) = fismf("trapmf",[-2 0 1 3],'Name',"rancia");
fis2.Inputs(2).MembershipFunctions(2) = fismf("trapmf",[7 9 10 12],'Name',"deliciosa");
fis2.Outputs(1) = fisvar([0 30],'Name',"propina");
mf1 = fismf("trimf",[0 5 10],'Name',"barata");
mf2 = fismf("trimf",[10 15 20],'Name',"promedio");
mf3 = fismf("trimf",[20 25 30],'Name',"generosa");
fis2.Outputs(1).MembershipFunctions = [mf1 mf2 mf3];
rule1 = fisrule([1 1 1 1 2],2); % numero de entradas
rule2 = fisrule([2 0 2 1 1],2);
rule3 = fisrule([3 2 3 1 2],2);
rules = [rule1 rule2 rule3];
rules = update(rules,fis2); % sintaxys
Ejemplo: Decodificación tipo Sugeno
fis1 = addInput(fis1,[-1 1],'Name','E');
fis1 = addInput(fis1,[-1 1],'Name','delE');
fis1 = addMF(fis1,'E','trimf',[-2 -1 0],'Name','N');
fis1 = addMF(fis1,'E','trimf',[-1 0 1],'Name','Z');
fis1 = addMF(fis1,'E','trimf',[0 1 2],'Name','P');
fis1 = addMF(fis1,'delE','trimf',[-2 -1 0],'Name','N');
fis1 = addMF(fis1,'delE','trimf',[-1 0 1],'Name','Z');
fis1 = addMF(fis1,'delE','trimf',[0 1 2],'Name','P');
fis1 = addOutput(fis1,[-1 1],'Name','U');
fis1 = addMF(fis1,'U','constant',-1,'Name','NB');
fis1 = addMF(fis1,'U','constant',-0.5,'Name','NM');
fis1 = addMF(fis1,'U','constant',0,'Name','Z');
fis1 = addMF(fis1,'U','constant',0.5,'Name','PM');
fis1 = addMF(fis1,'U','constant',1,'Name','PB');
"E==N & delE==N => U=NB"; ...
"E==Z & delE==N => U=NM"; ...
"E==P & delE==N => U=Z"; ...
"E==N & delE==Z => U=NM"; ...
"E==Z & delE==Z => U=Z"; ...
"E==P & delE==Z => U=PM"; ...
"E==N & delE==P => U=Z"; ...
"E==Z & delE==P => U=PM"; ...
"E==P & delE==P => U=PB" ...
fis1 = addRule(fis1,rules);

La salida del controlador (u) se encuentra usado el error (e) y la derivada del error (
). Usando los factores de escala
y
, las respectivas entradas son normalizadas a E y
respectivamente. Los rangos de normalización para ambas entradas están en el
. El controlador lógico difuso también porduce una salida normalizada en el rango
. Los factores de escala adicionales
y
mapean la salida U del controlador lógico difuso a u Este ejemplo es una adaptación de:
Mendel, J. M., Uncertain Rule-Based Fuzzy Systems: Introduction and New Directions, Second Edition, Springer, 2017, pp. 229-234, 600-608.
Ejemplo: FIS tipo Sugeno
Usa singletones como funciones de membresia de la salida que pueden ser contantes o funciones lineales de los valores de entrada. El proceso de defusificación en un FIS Sugeno es mas eficiente que el de un FIS Mamdani puesto que utiliza solo algunos puntos para su cálculo.
Cada regla en el sistema de Sugeno opera como lo muestra la siguiente figura
Cada regla genera dos valores
con grado de pertenecia 1 (consecuente)
(antecedente)
La implicación se realiza con el regla del producto (
). La agregación es la suma de las salidas, y la defusificcación es un promedio ponderado. donde Nes el numero de reglas. La siguiente figura muestra un ejemplo de un FIS Sugeno
Debido a la dependencia lineal de cada regla de las variables de entrada, el método Sugeno es ideal para actuar como un supervisor interpolador de múltiples controladores lineales que se van a aplicar, respectivamente, a diferentes condiciones de operación de un sistema dinámico no lineal.
fiss = sugfis('Name','propinaSugeno');
fiss.Inputs(1) = fisvar([0 10],'Name',"servicio");
mf1 = fismf("gaussmf",[1.5 0],'Name',"pobre");
mf2 = fismf("gaussmf",[1.5 5],'Name',"bueno");
mf3 = fismf("gaussmf",[1.5 10],'Name',"excelente");
fiss.Inputs(1).MembershipFunctions = [mf1 mf2 mf3];
fiss.Inputs(2) = fisvar([0 10],'Name',"comida");
fiss.Inputs(2).MembershipFunctions(1) = fismf("trapmf",[-2 0 1 3],'Name',"rancia");
fiss.Inputs(2).MembershipFunctions(2) = fismf("trapmf",[7 9 10 12],'Name',"deliciosa");
fiss = addOutput(fiss,[0 25],'Name','propina');
fiss = addMF(fiss,'propina','constant',5,'Name','barata');
fiss = addMF(fiss,'propina','constant',15,'Name','promedio');
fiss = addMF(fiss,'propina','constant',25,'Name','genrosa');
%fiss = addMF(fiss,'propina','linear',[.05 .05 5],'Name','otra');
rule1 = fisrule([1 1 1 1 2],2); % numero de entradas
rule2 = fisrule([2 0 2 1 1],2);
rule3 = fisrule([3 2 3 1 2],2);
rules = [rule1 rule2 rule3];
rules = update(rules,fiss); % sintaxys
Referencias
La mayor parte del material se ha tomado de: Fuzzy Logic Toolbox User's Guide. 2021a