Mamdanis Algorithmus in Fuzzy-Inferenzsystemen

Einleitung


Es ist einfach so passiert, dass es üblich ist, einen Artikel über Fuzzy-Logik mit dem Namen Lotfi Zadeh zu beginnen. Und ich werde keine Ausnahme sein. Tatsache ist, dass dieser Mann nicht nur der Begründer einer ganzen wissenschaftlichen Theorie wurde, die 1965 das Grundwerk „Fuzzy Sets“ schrieb, sondern auch verschiedene Möglichkeiten für deren praktische Anwendung ausarbeitete. Seine Herangehensweise beschrieb er 1973 im Text „Überblick über einen neuen Ansatz zur Analyse komplexer Systeme und Entscheidungsprozesse“ (veröffentlicht in IEEE Transactions on Systems). Es ist bemerkenswert, dass ein dänisches Unternehmen unmittelbar nach seiner Veröffentlichung sehr erfolgreich die darin enthaltenen Grundsätze angewendet hat, um sein Managementsystem für einen komplexen Produktionsprozess zu verbessern.

Bei allem Verdienst von L. Zade haben die Anhänger dieser Theorie einen ebenso wichtigen Beitrag geleistet. Zum Beispiel der englische Mathematiker E. Mamdani (Ebrahim Mamdani). 1975 entwickelte er einen Algorithmus, der als Methode zur Steuerung einer Dampfmaschine vorgeschlagen wurde. Der von ihm vorgeschlagene Algorithmus, der auf Fuzzy-Inferenz basiert, ermöglichte es, einen übermäßig großen Rechenaufwand zu vermeiden und wurde von Experten geschätzt. Dieser Algorithmus hat derzeit die größte praktische Anwendung bei Fuzzy-Modellierungsproblemen erhalten.

Schlüsseldefinitionen


Bevor Sie sich mit dem Algorithmus vertraut machen, müssen Sie sich kurz mit den folgenden Definitionen vertraut machen: Eine

Fuzzy-Variable ist ein Tupel der Form <α, X , Δ >, wobei:
α der Name der Fuzzy-Variablen ist;
X ist seine Definitionsdomäne;
A - Fuzzy - Menge im Universum von X .

Beispiel: Fuzzy-Variable <"Heavy body armor", { x | 0 kg < x <35 kg}, B = { x , μ ( x )}> kennzeichnet die Masse des militärischen Körperschutzes. Wir werden es als schwer betrachten, wenn seine Masse> 16 kg ist (Abb. 1).

Abb. 1. Diagramm der Zugehörigkeitsfunktion μ ( x ) für eine Fuzzy-Menge B. Eine

Sprachvariable ist ein Tupel <β, T, X, G, M >, wobei:
β der Name der Sprachvariablen ist;
T ist die Menge seiner Bedeutungen (Ausdrücke);
X ist das Universum der Fuzzy-Variablen;
G ist das syntaktische Verfahren zur Bildung neuer Terme;
M ist eine semantische Prozedur, die für jeden Term einer gegebenen linguistischen Variablen Fuzzy-Mengen bildet.

Ein Beispiel:Angenommen, wir haben eine subjektive Einschätzung der Masse der Körperpanzerung. Es kann zum Beispiel von Militärpersonal (das als Sachverständige fungiert) bezogen werden, das sich direkt mit dieser Munition befasst. Diese Beurteilung kann unter Verwendung der folgenden Sprachvariablen <β, T, X, G, M > (Abb. 2) formalisiert werden :
β - Kugelsichere Weste;
T - {"Leichte Körperschutzkleidung (Light)", "Mittlere Körperschutzkleidung (Medium)", "Schwere Körperschutzkleidung (Heavy)"};
X = [0; 35];
G - das Verfahren zur Bildung neuer Begriffe unter Verwendung logischer Verknüpfungen und Modifikatoren. Zum Beispiel "sehr schwere Körperschutzkleidung";
M ist die Aufgabenprozedur auf dem Universum X = [0; 35] Werte der sprachlichen Variablen, dh Begriffe aus dem SatzT .

Abb. 2. Graphen der Zugehörigkeitsfunktionen der Werte der Sprachvariablen "Bulletproof Vest" Eine

Fuzzy-Aussage ist eine Aussage der Form "β IS α", wobei:
β eine Sprachvariable ist;
α ist einer der Begriffe dieser Variablen.

Beispiel: "IS Lightweight Body Armor". Hier ist die „kugelsichere Weste“ eine sprachliche Variable und ihre „leichte“ Bedeutung.

Einfach ausgedrückt wird die Regel von Fuzzy-Produkten (im Folgenden einfach die Regel) die klassische Regel der Form „WENN ... DANN ...“ genannt, wobei Fuzzy-Aussagen als Bedingungen und Schlussfolgerungen verwendet werden. Solche Regeln werden in folgenden Form geschrieben:

IF (β 1 α IST 1 ) und (β 2 IST α 2) DANN (β 3 IST α 3 ).

Neben „UND“ wird auch das logische Verknüpfungselement „ODER“ verwendet. In der Regel versuchen sie jedoch, einen solchen Datensatz zu vermeiden, indem sie solche Regeln in mehrere einfachere Regeln (ohne "ODER") aufteilen. Außerdem wird jede der Fuzzy-Anweisungen unter der Bedingung einer Regel als Unterbedingung bezeichnet . Ebenso wird jede der Aussagen in der Schlussfolgerung als Unterklausel bezeichnet .

Beispiel: Die folgenden Beispiele helfen, die Definition zu korrigieren:

1) WENN (schwerer Körperschutz) DANN (müder Soldat);
2) WENN (Ehemann ist nüchtern) UND (hohes Gehalt) DANN (zufriedene Frau).

Das ist alles. Dieses Minimum reicht aus, um die Prinzipien des Algorithmus zu verstehen.

Mamdani-Algorithmus


Dieser Algorithmus beschreibt mehrere aufeinanderfolgende Stufen (Abb. 3). Gleichzeitig erhält jede nachfolgende Stufe die im vorherigen Schritt erhaltenen Werte als Eingabe.

Abb. 3. Das Aktivitätsdiagramm des Fuzzy-Inferenz-Prozesses

Der Algorithmus zeichnet sich dadurch aus, dass er nach dem Prinzip einer „Black Box“ arbeitet. Der Eingang erhält quantitative Werte, der Ausgang ist der gleiche. In Zwischenstufen werden die Apparatur der Fuzzy-Logik und die Theorie der Fuzzy-Mengen angewendet. Dies ist die Eleganz der Verwendung von Fuzzy-Systemen. Sie können die üblichen numerischen Daten bearbeiten und gleichzeitig die flexiblen Funktionen von Fuzzy-Inferenzsystemen nutzen.

Zur Implementierung des Algorithmus wurde ein objektorientierter Ansatz verwendet. Der Quellcode ist in der Programmiersprache Java geschrieben. Das Diagramm (Abb. 4) zeigt die wichtigsten Beziehungen und Beziehungen zwischen den am Algorithmus beteiligten Klassen.

Abb. 4. Klassendiagramm der Implementierung des Mamdani-Algorithmus

Regeln (Rule) bestehen aus Bedingungen (Condition) und Schlussfolgerungen (Conclusion), die wiederum unscharfe Aussagen (Statement) sind. Eine Fuzzy-Anweisung enthält eine sprachliche Variable (Variable) und einen Begriff, der durch eine Fuzzy-Menge (FuzzySet) dargestellt wird. Eine Zugehörigkeitsfunktion wird für eine Fuzzy-Menge definiert, deren Wert mit der Methode getValue () ermittelt werden kann. Dies ist die in der FuzzySetIface-Schnittstelle definierte Methode. Bei der Ausführung des Algorithmus muss das „aktivierte“ Fuzzy-Set (ActivatedFuzzySet) verwendet werden, das die Zugehörigkeitsfunktion des Fuzzy-Sets (FuzzySet) in gewisser Weise neu definiert. Der Algorithmus verwendet auch eine Vereinigung von Fuzzy-Mengen (UnionOfFuzzySets). Die Union ist auch eine unscharfe Menge,

Der Mamdani-Algorithmus (MamdaniAlgorithmus) umfasst alle Stufen (Abb. 3) und verwendet die Regelbasis (Liste)) als Eingabe. Der Algorithmus beinhaltet auch die Verwendung von "aktivierten" Fuzzy-Sets (ActivatedFuzzySet) und deren Assoziationen (UnionOfFuzzySets).

Die Stufen der Fuzzy-Inferenz werden also nacheinander ausgeführt. Alle im vorherigen Schritt erhaltenen Werte können im nächsten Schritt verwendet werden.

1. Bildung einer Regelbasis Eine
Regelbasis ist ein Satz von Regeln, bei denen jedem Unterabschnitt ein bestimmter Gewichtungskoeffizient zugeordnet ist.

Die Regelbasis aussehen könnte (beispielsweise verwenden , um die Regeln der verschiedenen Designs):

Rule_1: die IF «Condition_1» THEN - Anweisung «Conclusion_1» ( F 1 ) , sowie UND «Conclusion_2» ( die F 2 );
RULE_2: WENN "Bedingung_2" UND "Bedingung_3" DANN "Schlussfolgerung_3" (F 3 );
...
RULE_n: WENN "Condition_k" DANN "Conclusion_ (q-1)" ( F q-1 ) UND "Conclusion_q" ( F q );

Wo der F i - Gewichte, um den Grad des Vertrauens in die Gültigkeit der erhaltenen podzaklyucheniya Bedeutung ( i = 1, .. q ). Standardmäßig wird als Gewichtungsfaktor 1 angenommen. In Bedingungen vorhandene sprachliche Variablen werden als Eingabe und in Schlussfolgerungen als Ausgabe bezeichnet .

Legende:
n ist die Anzahl der Fuzzy-Produktionsregeln (numberOfRules).
m - Anzahl der Eingabevariablen (numberOfInputVariables).
s- Anzahl der Ausgabevariablen (numberOfOutputVariables).
k ist die Gesamtzahl der Unterbedingungen in der Regelbasis (numberOfConditions).
q ist die Gesamtzahl der Unterverbindungen in der Regelbasis (numberOfConclusions).

Hinweis: Diese Symbole werden in den folgenden Schritten verwendet. In Klammern stehen die Namen der entsprechenden Variablen im Quellcode.

2. Unschärfe von Eingangsgrößen
Diese Stufe wird oft als Reduktion auf Unschärfe bezeichnet. Die Eingabebasis von Regeln und ein Array von Eingabedaten A = {a 1 , ..., a m}. Dieses Array enthält die Werte aller Eingabevariablen. Der Zweck dieses Schritts besteht darin, Wahrheitswerte für alle Unterbedingungen aus der Regelbasis zu erhalten. Dies geschieht wie folgt: Für jede der Teilbedingungen wird der Wert b i = μ ( a i ) gefunden. Somit ist es eine Vielzahl von Werten erhält b i ( i = 1 .. k ).

Implementierung: Hinweis: Das Eingangsdatenarray ist so aufgebaut, dass das i- te Element des Arrays der i- ten Eingangsvariablen entspricht (die Variablennummer wird im Integer-Feld "id" gespeichert). 3. Aggregation von Voraussetzungen
private double[] fuzzification(double[] inputData) {
    int i = 0;
    double[] b = new double[numberOfConditions];
    for (Rule rule : rules) {
        for (Condition condition : rule.getConditions()) {
            int j = condition.getVariable().getId();
            FuzzySet term = condition.getTerm();
            b[i] = term.getValue(inputData[j]);
            i++;
        }
    }
    return b;
}





Wie oben erwähnt, kann eine Regelbedingung zusammengesetzt sein, d.h. Beziehen Sie Teilbedingungen ein, die mit der logischen Verknüpfung „AND“ verbunden sind. Der Zweck dieser Stufe besteht darin, den Wahrheitsgrad der Bedingungen für jede Regel des Fuzzy-Inferenzsystems zu bestimmen. Einfach ausgedrückt, finden wir für jede Bedingung den Minimalwert der Wahrheit aller ihrer Unterbedingungen. Formal sieht es so aus:

c j = min { b i }.

Wobei:
j = 1 .. n ;
i ist die Anzahl der Anzahl der Teilbedingungen, an denen die j- te Eingangsvariable beteiligt ist .

Implementierung: 4. Aktivierung von Unterverträgen
private double[] aggregation(double[] b) {
    int i = 0;
    int j = 0;
    double[] c = new double[numberOfInputVariables];
    for (Rule rule : rules) {
        double truthOfConditions = 1.0;
        for (Condition condition : rule.getConditions()) {
            truthOfConditions = Math.min(truthOfConditions, b[i]);
            i++;
        }
        c[j] = truthOfConditions;
        j++;
    }
    return c;
}



In dieser Phase erfolgt ein Übergang von Bedingungen zu Unteraufträgen. Für jede Subklusion wird der Wahrheitsgrad d i = c i * F i gefunden , wobei i = 1 .. q . Dann wird wiederum für jede i- te Untergliederung die Menge D i einer neuen Zugehörigkeitsfunktion zugeordnet. Sein Wert ergibt sich aus mindestens d i und der Wert des Begriffes Zugehörigkeitsfunktion aus dem Unterabschnitt. Diese Methode nennt man Min-Aktivierung, die formal wie folgt geschrieben wird:

μ ' i ( x ) = min { d i, μ i ( x )}.

Wobei:
μ ' i ( x ) - "aktivierte" Zugehörigkeitsfunktion;
μ i ( x ) - Termmitgliedschaftsfunktion;
d i - der Wahrheitsgrad der i- ten Unterverbindung.

Das Ziel dieser Stufe ist es also, eine Menge von "aktivierten" Fuzzy-Mengen D i für jeden der Unterabschnitte in der Regelbasis zu erhalten ( i = 1 .. q ).

Umsetzung: 5. Zusammenfassung der Schlussfolgerungen
private List activation(double[] c) {
    int i = 0;
    List activatedFuzzySets = new ArrayList();
    double[] d = new double[numberOfConclusions];
    for (Rule rule : rules) {
        for (Conclusion conclusion : rule.getConclusions()) {
          d[i] = c[i]*conclusion.getWeight();
          ActivatedFuzzySet activatedFuzzySet = (ActivatedFuzzySet) conclusion.getTerm();
          activatedFuzzySet.setTruthDegree(d[i]);
          activatedFuzzySets.add(activatedFuzzySet);
          i++;
        }
    }
    return activatedFuzzySets;
}


private double getActivatedValue(double x) {
    return Math.min(super.getValue(x), truthDegree);
}



Der Zweck dieser Stufe besteht darin, eine Fuzzy-Menge (oder deren Kombination) für jede der Ausgangsvariablen zu erhalten. Dies geschieht wie folgt: Die i- te Ausgangsvariable wird der Vereinigung der Mengen E i = ∪ D j zugeordnet . Wobei j die Anzahl der Unterverbindungen ist, an denen die i- te Ausgangsvariable ( i = 1 .. s ) beteiligt ist . Die Vereinigung von zwei Fuzzy-Mengen ist die dritte Fuzzy-Menge mit der folgenden Zugehörigkeitsfunktion:

μ ' i ( x ) = max {μ 1 ( x ), μ 2 ( x )}, wobei μ1 ( x ), μ 2 ( x ) - Zugehörigkeitsfunktionen von verbundenen Mengen.

Implementierung: 6. Defuzzifizierung von Ausgabevariablen Der Zweck der Defuzzifizierung besteht darin, für jede der ausgegebenen sprachlichen Variablen einen eindeutigen Wert zu erhalten. Formal geschieht dies wie folgt. Die i- te Ausgangsvariable und die dazugehörige Menge E i ( i = 1 .. s ) werden berücksichtigt . Dann wird unter Verwendung der Defuzzifizierungsmethode der endgültige quantitative Wert der Ausgangsvariablen gefunden. Bei dieser Implementierung des Algorithmus wird die Schwerpunktmethode verwendet, bei der der Wert von i
private List accumulation(List activatedFuzzySets) {
    List unionsOfFuzzySets =
        new ArrayList(numberOfOutputVariables);
    for (Rule rule : rules) {
        for (Conclusion conclusion : rule.getConclusions()) {
            int id = conclusion.getVariable().getId();
            unionsOfFuzzySets.get(id).addFuzzySet(activatedFuzzySets.get(id));
        }
    }
    return unionsOfFuzzySets;
}


private double getMaxValue(double x) {
    double result = 0.0;
    for (FuzzySet fuzzySet : fuzzySets) {
        result = Math.max(result, fuzzySet.getValue(x));
    }
    return result;
}



-te Ausgangsvariable wird durch die Formel berechnet:


Wobei:
μ i ( x ) - Zugehörigkeitsfunktion der entsprechenden Fuzzy-Menge E i ;
Min und Max sind die Grenzen des Universums der Fuzzy-Variablen.
y i ist das Ergebnis der Defazzifikation.

Implementierung:
private double[] defuzzification(List unionsOfFuzzySets) {
    double[] y = new double[numberOfOutputVariables];
    for(int i = 0; i < numberOfOutputVariables; i++) {
        double i1 = integral(unionsOfFuzzySets.get(i), true);
        double i2 = integral(unionsOfFuzzySets.get(i), false);
        y[i] = i1 / i2;
    }
    return y;
}


Fazit


Mamdanis Algorithmus und viele andere Fuzzy-Inferenz-Algorithmen sind bereits in so wundervollen Produkten wie der Fuzzy Logic Toolbox (Erweiterung für MatLab), FuzzyTECH und vielen anderen implementiert. Daher ist eine so detaillierte Betrachtung des Algorithmus wie in diesem Artikel eher theoretisch als praktisch. Ich stelle jedoch fest, dass es nur mit einer soliden Grundlage des Wissens und des Verständnisses der Grundlagen des Algorithmus möglich wird, ihn mit maximaler Wirkung anzuwenden.

Literatur


Für diejenigen, die sich mit konkreten Beispielen für die Anwendung des beschriebenen Algorithmus vertraut machen möchten, empfehle ich, sich an folgende Literatur zu

wenden : 1. Leonenkov A.V. Fuzzy-Modellierung in MATLAB und FuzzyTECH / A. Leonenkov. - St. Petersburg: BHV-Petersburg, 2003 - 736 S.

2. Shtovba S.D. Entwerfen von Fuzzy-Systemen mit MATLAB / S. Shtovba. - M: Hotline - Telecom, 2007. - 288 p.

Jetzt auch beliebt: