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

Можно создать нечеткую систему вывода (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

Вы представляете нечеткие системы вывода с помощью объектов sugfis и mamfis. Эти объекты содержат всю нечеткую информацию о системе вывода, включая имена переменных, определения функции принадлежности и нечеткие методы вывода. Каждый 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:

    Name
    Type
    Parameters

  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)

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

plotmf(fis,'input',1)

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

plotmf(fis,'output',1)

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)

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

Как альтернатива использованию приложения 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 для И, 2 для ИЛИ)

Для индексов функции принадлежности укажите на НЕ условие с помощью отрицательной величины. Для получения дополнительной информации о нечеткой спецификации правила смотрите 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 =

   12.2184
    7.7885
    8.9547

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

| | | | |

Похожие темы