Создайте нечеткие системы в командной строке

Можно создать нечеткую систему вывода (FIS) в командной строке MATLAB®. Этот метод является альтернативой интерактивной разработке вашего FIS использование Fuzzy Logic Designer.

Этот пример показывает вам, как создать Mamdani нечеткая система вывода. В то время как вы создаете Mamdani FIS, используемые методы применяются к созданию систем Sugeno также.

Задача расчета чаевых в командной строке

Чтобы продемонстрировать функциональность командной строки для создания и просмотра нечетких систем вывода, этот пример использует самосвал FIS.

fis = readfis('tipper.fis');

Эта команда возвращает mamfis объект, который содержит свойства нечеткой системы. Для системы Sugeno эта команда возвращает sugfis объект.

Можно получить доступ к свойствам FIS с помощью записи через точку. Например, просмотрите входные параметры нечеткой системы.

fis.Inputs
ans = 
  1x2 fisvar array with properties:

    Name
    Range
    MembershipFunctions

  Details:
           Name        Range     MembershipFunctions
         _________    _______    ___________________

    1    "service"    0    10        {1x3 fismf}    
    2    "food"       0    10        {1x2 fismf}    

Чтобы установить свойства вашей нечеткой системы, используйте запись через точку. Например, определите имя FIS.

fis.Name = "gratuity";

Объект FIS

Вы представляете нечеткие системы вывода с помощью mamfis и sugfis объекты. Эти объекты содержат всю нечеткую информацию о системе вывода, включая имена переменных, определения функции принадлежности и нечеткие методы вывода. Каждый FIS является самостоятельно иерархией объектов. Следующие объекты используются в нечеткой системе:

  • fisvar объекты представляют обе переменные ввода и вывода.

  • fismf объекты представляют функции принадлежности в каждой переменной ввода и вывода.

  • fisrule объекты представляют нечеткие правила, что карта вводит к выходным параметрам.

Просмотрите всю информацию для FIS путем прямого листинга его свойств.

fis
fis = 
  mamfis with properties:

                       Name: "gratuity"
                  AndMethod: "min"
                   OrMethod: "max"
          ImplicationMethod: "min"
          AggregationMethod: "max"
      DefuzzificationMethod: "centroid"
                     Inputs: [1x2 fisvar]
                    Outputs: [1x1 fisvar]
                      Rules: [1x3 fisrule]
    DisableStructuralChecks: 0

	See 'getTunableSettings' method for parameter optimization.

Можно просмотреть свойства объектов в объекте FIS с помощью записи через точку. Например, просмотрите fisvar объект для первой входной переменной.

fis.Inputs(1)
ans = 
  fisvar with properties:

                   Name: "service"
                  Range: [0 10]
    MembershipFunctions: [1x3 fismf]

Кроме того, просмотрите функции принадлежности для этой переменной.

fis.Inputs(1).MembershipFunctions
ans = 
  1x3 fismf array with properties:

    Type
    Parameters
    Name

  Details:
            Name          Type       Parameters
         ___________    _________    __________

    1    "poor"         "gaussmf"    1.5      0
    2    "good"         "gaussmf"    1.5      5
    3    "excellent"    "gaussmf"    1.5     10

Системные функции отображения

Чтобы получить высокоуровневое представление вашей нечеткой системы из командной строки, используйте plotfis, plotmf, и gensurf функции. plotfis отображает целую систему как блок-схему, как показано в Fuzzy Logic Designer.

plotfis(fis)

Figure contains 4 axes objects. Axes object 1 contains 3 objects of type line. Axes object 2 contains 2 objects of type line. Axes object 3 contains 3 objects of type line. Axes object 4 contains 3 objects of type text.

plotmf графики функций все функции принадлежности сопоставлены с данной переменной. Например, просмотрите функции принадлежности для первой входной переменной.

plotmf(fis,'input',1)

Figure contains an axes object. The axes object contains 6 objects of type line, text.

Точно так же, чтобы просмотреть функции принадлежности для первого выхода, введите:

plotmf(fis,'output',1)

Figure contains an axes object. The axes object contains 6 objects of type line, text.

plotmf не поддерживает просмотр выходных функций принадлежности для систем Sugeno.

Чтобы просмотреть правила нечеткой системы, введите:

fis.Rules
ans = 
  1x3 fisrule array with properties:

    Description
    Antecedent
    Consequent
    Weight
    Connection

  Details:
                                Description                        
         __________________________________________________________

    1    "service==poor | food==rancid => tip=cheap (1)"           
    2    "service==good => tip=average (1)"                        
    3    "service==excellent | food==delicious => tip=generous (1)"

gensurf графики функций выход FIS для любого или двух входных переменных.

gensurf(fis)

Figure contains an axes object. The axes object contains an object of type surface.

Создайте нечеткую систему вывода

Как альтернатива использованию приложения Fuzzy Logic Designer, можно создать FIS полностью из командной строки.

Во-первых, создайте Mamdani FIS, задав его имя.

fis = mamfis('Name',"tipper");

Добавьте первую входную переменную для качества обслуживания с помощью addInput.

fis = addInput(fis,[0 10],'Name',"service");

Добавьте функции принадлежности для каждого из уровней качества обслуживания с помощью addMF. В этом случае используйте Гауссовы функции принадлежности. Для получения дополнительной информации о Гауссовых свойствах функции принадлежности смотрите gaussmf.

fis = addMF(fis,"service","gaussmf",[1.5 0],'Name',"poor");
fis = addMF(fis,"service","gaussmf",[1.5 5],'Name',"good");
fis = addMF(fis,"service","gaussmf",[1.5 10],'Name',"excellent");

Добавьте вторую входную переменную для качества продуктов и добавьте две трапециевидных функции принадлежности. Для получения информации о трапециевидных функциях принадлежности смотрите trapmf.

fis = addInput(fis,[0 10],'Name',"food");
fis = addMF(fis,"food","trapmf",[-2 0 1 3],'Name',"rancid");
fis = addMF(fis,"food","trapmf",[7 9 10 12],'Name',"delicious");

Добавьте выходную переменную для совета и добавьте три треугольных функции принадлежности. Для получения дополнительной информации о треугольной функции принадлежности смотрите trimf.

fis = addOutput(fis,[0 30],'Name',"tip");
fis = addMF(fis,"tip","trimf",[0 5 10],'Name',"cheap");
fis = addMF(fis,"tip","trimf",[10 15 20],'Name',"average");
fis = addMF(fis,"tip","trimf",[20 25 30],'Name',"generous");

Задайте следующие три правила для FIS как числовой массив:

  1. Если (сервис плох), или (еда является прогорклой), то (совет является дешевым).

  2. Если сервис хорош, то чаевые средние.

  3. Если сервис превосходен, или еда восхитительна, то чаевые щедрые.

Каждая строка массива содержит одно правило в следующем формате.

  • Столбец 1 - индекс функции принадлежности для первого входа

  • Столбец 2 - индекс функции принадлежности для второго входа

  • Столбец 3 - индекс функции принадлежности для выхода

  • Столбец 4 - вес Правила (от 0 к 1)

  • Столбец 5 - Нечеткий оператор (1 для AND, 2 для OR)

Для индексов функции принадлежности укажите на НЕ условие с помощью отрицательной величины. Для получения дополнительной информации о нечеткой спецификации правила смотрите addRule.

ruleList = [1 1 1 1 2;
            2 0 2 1 1;
            3 2 3 1 2];

Добавьте правила в FIS.

fis = addRule(fis,ruleList);

В качестве альтернативы можно создать нечеткую систему вывода с помощью комбинации записи через точку и fisvar, fismf, и fisrule объекты. Этот метод не является хорошей практикой для большинства приложений. Однако можно использовать этот подход, когда приложение требует большей гибкости в построении и изменении FIS.

Создайте нечеткую систему вывода.

fis = mamfis('Name','tipper');

Добавьте и сконфигурируйте первую входную переменную. В этом случае создайте fisvar по умолчанию возразите и задайте его свойства с помощью записи через точку.

fis.Inputs(1) = fisvar;
fis.Inputs(1).Name = "service";
fis.Inputs(1).Range = [0 10];

Задайте функции принадлежности для первой входной переменной. Для каждого MF создайте fismf объект и набор свойства с помощью записи через точку.

fis.Inputs(1).MembershipFunctions(1) = fismf;
fis.Inputs(1).MembershipFunctions(1).Name = "poor";
fis.Inputs(1).MembershipFunctions(1).Type = "gaussmf";
fis.Inputs(1).MembershipFunctions(1).Parameters = [1.5 0];
fis.Inputs(1).MembershipFunctions(2) = fismf;
fis.Inputs(1).MembershipFunctions(2).Name = "good";
fis.Inputs(1).MembershipFunctions(2).Type = "gaussmf";
fis.Inputs(1).MembershipFunctions(2).Parameters = [1.5 5];
fis.Inputs(1).MembershipFunctions(3) = fismf;
fis.Inputs(1).MembershipFunctions(3).Name = "excellent";
fis.Inputs(1).MembershipFunctions(3).Type = "gaussmf";
fis.Inputs(1).MembershipFunctions(3).Parameters = [1.5 10];

Добавьте и сконфигурируйте вторую входную переменную. Для этой переменной задайте имя и область значений, когда вы создадите fisvar объект.

fis.Inputs(2) = fisvar([0 10],'Name',"food");

Задайте функции принадлежности для второго входа. Для каждого MF задайте имя, введите, и параметры, когда вы создадите fismf объект.

fis.Inputs(2).MembershipFunctions(1) = fismf("trapmf",[-2 0 1 3],...
                                             'Name',"rancid");
fis.Inputs(2).MembershipFunctions(2) = fismf("trapmf",[7 9 10 12],...
                                             'Name',"delicious");

Точно так же добавьте и сконфигурируйте выходную переменную и ее функции принадлежности.

fis.Outputs(1) = fisvar([0 30],'Name',"tip");

В этом случае задайте выходные функции принадлежности с помощью вектора из fismf объекты.

mf1 = fismf("trimf",[0 5 10],'Name',"cheap");
mf2 = fismf("trimf",[10 15 20],'Name',"average");
mf3 = fismf("trimf",[20 25 30],'Name',"generous");
fis.Outputs(1).MembershipFunctions = [mf1 mf2 mf3];

Создайте правила для нечеткой системы. Поскольку каждое правило создает fisrule объект. Затем задайте правила с помощью вектора из этих объектов. При создании fisrule объект с помощью числовых значений, необходимо задать количество входных переменных.

rule1 = fisrule([1 1 1 1 2],2);
rule2 = fisrule([2 0 2 1 1],2);
rule3 = fisrule([3 2 3 1 2],2);
rules = [rule1 rule2 rule3];

Прежде, чем добавить ваши правила в вашу нечеткую систему, необходимо обновить их использующий данные в объекте FIS. Обновите правила с помощью update функция, и добавляет их нечеткая система.

rules = update(rules,fis);
fis.Rules = rules;

При построении нечеткой системы можно также задать пользовательские функции принадлежности и заключить функции. Для получения дополнительной информации смотрите Сборку Нечеткие Системы Используя Пользовательские Функции.

Оцените нечеткую систему вывода

Чтобы оценить выход нечеткой системы для данной входной комбинации, используйте evalfis команда. Например, оцените fis использование значений входной переменной 1 и 2.

evalfis(fis,[1 2])
ans = 5.5586

Можно также оценить несколько входных комбинаций с помощью массива, где каждая строка представляет входную комбинацию того.

inputs = [3 5;
          2 7;
          3 1];
evalfis(fis,inputs)
ans = 3×1

   12.2184
    7.7885
    8.9547

Смотрите также

| | | | |

Похожие темы