Sistemas de Inferencia difusos

(Fuzzy Inference Systems o FIS)

Contenido

Componentes de un sistema de inferencia difuso

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).
inferenciaDIfsuo.png

Sistemas de inferencia difusos: Mamdani y Sugeno

Mamdani
Sugeno

MATLAB Tollbox

GraficaInfe.png

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:
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
  1. Fusifiación de las variables de entrada
  2. Apicación de las operaciones difusas (AND, OR, NOT) en el antecedente
  3. Implicación del antecedente al consecuente
  4. Agregacion de todas consecuencias de las reglas
  5. Defusificación

Fusifiación de las entradas

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

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.
plotfis(fis)
plotmf(fis,'input',1)
plotmf(fis,'input',2)
ruleList = [1 1 1 1 2;
2 0 2 1 1;
3 2 3 1 2];
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.
plotmf(fis,'output',1)
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)"
gensurf(fis)
evalfis(fis,[1 2])
ans = 5.5586

Construcción alternativa tipo Mamdani

fis2 = mamfis('Name','propina2');
% Servicio
fis2.Inputs(1) = fisvar;
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];
% Comida
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");
% propina
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];
% Reglas
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
fis2.Rules = rules;
evalfis(fis2,[1 2])
ans = 5.5586

Ejemplo: Decodificación tipo Sugeno

fis1 = sugfis();
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');
figure
subplot(1,2,1)
plotmf(fis1,'input',1)
title('Input 1')
subplot(1,2,2)
plotmf(fis1,'input',2)
title('Input 2')
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');
rules = [...
"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);
figure
gensurf(fis1)
pidDifuso.png
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
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');
% Servicio
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];
% Comida
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');
% Reglas
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
fiss.Rules = rules;
fuzzyLogicDesigner(fiss)

Referencias

La mayor parte del material se ha tomado de: Fuzzy Logic Toolbox User's Guide. 2021a