Настройка нечетких правил и параметров функции принадлежности

В этом примере показано, как настроить систему нечеткого вывода (FIS). Использование tunefis функция, вы можете:

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

  • Учитесь нечетким правилам.

  • Настройте предшествующие и последующие параметры нечетких правил.

Для получения дополнительной информации о настройке FIS см. Раздел «Настройка систем нечеткого вывода».

Настройка параметров функции принадлежности

Для FIS типов 1 и 2 можно задать настраиваемый параметр настройки для входа и выходных MF и настроить значения выбранных параметров. Можно настроить параметры для любой комбинации входа и выходных MF. Этот пример показывает пример рабочего процесса с использованием FIS типа 1. Для примера, который настраивает FIS типа 2, см. «Предсказание хаотических временных рядов с использованием Type-2 FIS».

Создайте FIS.

fis = mamfis;
fis = addInput(fis,[0 10],'NumMFs',3);
fis = addOutput(fis,[0 1],'NumMFs',3);
fis = addRule(fis,[1 1 1 1;1 1 1 1;1 1 1 1]);

Извлеките настройки входного и выходных параметров из FIS.

[in,out] = getTunableSettings(fis)
in = 
  VariableSettings with properties:

                   Type: "input"
           VariableName: "input1"
    MembershipFunctions: [1×3 fuzzy.tuning.MembershipFunctionSettings]
                FISName: "fis"

out = 
  VariableSettings with properties:

                   Type: "output"
           VariableName: "output1"
    MembershipFunctions: [1×3 fuzzy.tuning.MembershipFunctionSettings]
                FISName: "fis"

Настройки параметра представлены VariableSettings объекты, которые включают имя FIS, тип переменной, имя переменной и настройки параметров MF. Осмотрите настройки параметров МФ 1 входа 1.

in(1).MembershipFunctions(1).Parameters
ans = 
  NumericParameters with properties:

    Minimum: [-Inf -Inf -Inf]
    Maximum: [Inf Inf Inf]
       Free: [1 1 1]

Для каждого значения параметров входного или выходного MF можно задать его доступность для настройки и его минимальное и максимальное значения. По умолчанию все параметры MF бесплатны для настройки, и их области значений установлены на [-Inf, Inf].

Можно задать настраиваемость всех параметров в MF, используя setTunable функция. Для примера сделать MF 1 из входа 1 нетронутым.

in(1).MembershipFunctions(1) = setTunable(in(1).MembershipFunctions(1),false);

Можно также задать настраиваемость отдельных параметров MF. Сделать первый параметр MF 2 из входа 1 нетронутым.

in(1).MembershipFunctions(2).Parameters.Free(1) = false;

Для каждого параметра можно задать область значений возможных значений. Для примера установите минимальные значения для второго и третьего параметров MF 3 входа 1 равными 0.

in(1).MembershipFunctions(3).Parameters.Minimum(2:3) = 0;

Точно так же установите максимальные значения для второго и третьего параметров MF 3 входа 1 равными 15.

in(1).MembershipFunctions(3).Parameters.Maximum(2:3) = 15;

Процесс настройки устанавливает минимальное и максимальное значения области значений настраиваемых параметров MF по умолчанию к их соответствующим входным или выходным диапазонам.

Наконец, сделайте параметры MF всех выходных функций членства нетронутыми.

out = setTunable(out,false);

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

y=|sin(2x)ex/5|

x = (0:0.1:10)';
y = abs(sin(2*x)./exp(x/5));

Задайте опции для tunefis. В данном примере используйте метод настройки генетического алгоритма. Используйте максимум пять генерации для оптимизации.

options = tunefisOptions("Method","ga");
options.MethodOptions.MaxGenerations = 5;

Если у вас есть программное обеспечение Parallel Computing Toolbox™, можно улучшить скорость процесса настройки, установив options.UseParallel на true. Если у вас нет программного обеспечения Parallel Computing Toolbox, установите options.UseParallel на false, которое является значением по умолчанию.

По умолчанию tunefis использует корневую среднюю квадратичную невязку (RMSE) для вычисления стоимости. Вы можете изменить функцию затрат на norm1 или norm2 путем установки options.DistanceMetric.

options.DistanceMetric = "norm1";

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

rng('default') % for reproducibility
[fisout,optimout] = tunefis(fis,[in;out],x,y,options);
                                  Best           Mean      Stall
Generation      Func-count        f(x)           f(x)    Generations
    1              100           32.84           32.84        0
    2              147           32.84           32.84        1
    3              194           32.84           32.84        2
    4              241           32.84           32.84        3
    5              288           32.84           32.84        4
Optimization terminated: maximum number of generations exceeded.

fisout включает обновленные значения параметров. optimout обеспечивает дополнительные выходы метода оптимизации и любых сообщений об ошибке, которые возвращаются в процессе обновления входа нечеткой системы с помощью оптимизированных значений параметров.

optimout
optimout = struct with fields:
    tuningOutputs: [1×1 struct]
    totalFcnCount: 288
     totalRuntime: 2.7322
     errorMessage: []

optimout.tuningOutputs
ans = struct with fields:
             x: [5 9.1667 5.8333 10 14.1667]
          fval: 32.8363
      exitflag: 0
        output: [1×1 struct]
    population: [50×5 double]
        scores: [50×1 double]

Вы можете опционально настроить fis использование только параметров входа или выходного параметра. В этом примере, поскольку вы устанавливаете настройки выходного параметра nontunable, настройка FIS только с настройками входного параметра приводит к тем же результатам.

rng('default')
[fisout,optimout] = tunefis(fis,in,x,y,options);
                                  Best           Mean      Stall
Generation      Func-count        f(x)           f(x)    Generations
    1              100           32.84           32.84        0
    2              147           32.84           32.84        1
    3              194           32.84           32.84        2
    4              241           32.84           32.84        3
    5              288           32.84           32.84        4
Optimization terminated: maximum number of generations exceeded.
optimout
optimout = struct with fields:
    tuningOutputs: [1×1 struct]
    totalFcnCount: 288
     totalRuntime: 2.4521
     errorMessage: []

optimout.tuningOutputs
ans = struct with fields:
             x: [5 9.1667 5.8333 10 14.1667]
          fval: 32.8363
      exitflag: 0
        output: [1×1 struct]
    population: [50×5 double]
        scores: [50×1 double]

Настройка нечетких правил

В дополнение к настройке параметров функции принадлежности, можно настроить предшествующие и последующие параметры правил в нечеткой системе.

Получите настройки параметра правила от нечеткой системы с помощью getTunableSettings.

[~,~,rule] = getTunableSettings(fis)
rule=3×1 object
  3×1 RuleSettings array with properties:

    Index
    Antecedent
    Consequent
    FISName

Каждая настройка параметра rule включает имя FIS, индекс правила в FIS и настройки параметра для правила, предшествующего и последующего (положения правил).

Для предложения правила можно задать следующие параметры настройки.

  • AllowNot - Разрешить использование логики NOT, то есть отрицательных индексов MF. По умолчанию правила не допускают логики NOT.

  • Free - Сделать входные/выходные индексы MF доступными для настройки. По умолчанию параметры предложения доступны для настройки.

  • AllowEmpty - Допускает отсутствие входных/выходных переменных, то есть нулевых индексов MF. По умолчанию допускается отсутствие переменной.

rule(1).Antecedent(1)
ans = 
  ClauseParameters with properties:

      AllowNot: 0
    AllowEmpty: 1
          Free: 1

Разрешить логику NOT в предшествующем элементе правила 1.

rule(1).Antecedent.AllowNot = true;

Сделать последующее правило 1 недоступным для настройки.

rule(1).Consequent.Free = 0;

Не допускать отсутствия переменной в соответствии с правилом 2.

rule(2).Consequent.AllowEmpty = false;

Установите правило 3 как неотключаемое.

rule(3) = setTunable(rule(3),false);

Задайте options.DistanceMetric на norm2.

options.DistanceMetric = "norm2";

Настройка fis использование параметров правила.

rng('default')  % for reproducibility
fisout = tunefis(fis,rule,x,y,options);
                                  Best           Mean      Stall
Generation      Func-count        f(x)           f(x)    Generations
    1              100           1.648           2.575        0
    2              147           1.648           2.448        1
    3              194           1.648           2.212        2
    4              241           1.648           2.052        3
    5              288           1.648           1.874        4
Optimization terminated: maximum number of generations exceeded.

Поскольку вы указали правило 3 как неотключаемое, можно исключить правило 3 при настройке fis. Это дает тот же результат настройки.

rng('default')  % for reproducibility
fisout = tunefis(fis,rule(1:2),x,y,options);
                                  Best           Mean      Stall
Generation      Func-count        f(x)           f(x)    Generations
    1              100           1.648           2.575        0
    2              147           1.648           2.448        1
    3              194           1.648           2.212        2
    4              241           1.648           2.052        3
    5              288           1.648           1.874        4
Optimization terminated: maximum number of generations exceeded.

Изучение нечетких правил

Можно конфигурировать tunefis чтобы узнать правила нечеткой системы. Для этого установите OptimizationType опция tunefisOptions в "learning".

fisin = fis;
fisin.Rules = [];
options.OptimizationType = "learning";

Установите максимальное количество правил в настроенной FIS равным 3.

options.NumMaxRules = 3;

Размер настроенной основы правил может быть меньше NumMaxRules, потому что tunefis удаляет повторяющиеся правила из настроенной FIS. Если вы не задаете NumMaxRules, затем tunefis добавляет максимальное количество правил, определяемое возможными комбинациями входа MF. Входные комбинации MF по умолчанию включают нулевые индексы MF, которые допускают отсутствие переменных. Комбинации по умолчанию исключают отрицательные индексы MF, поэтому логика NOT не разрешена.

Задайте options.DistanceMetric на "rmse" и настройте FIS.

options.DistanceMetric = "rmse";
rng('default')  % for reproducibility
fisout = tunefis(fisin,[],x,y,options);
                                  Best           Mean      Stall
Generation      Func-count        f(x)           f(x)    Generations
    1              400           0.165          0.2956        0
    2              590           0.165          0.2805        1
    3              780           0.165          0.2578        2
    4              970           0.165          0.2393        3
    5             1160           0.165          0.2322        4
Optimization terminated: maximum number of generations exceeded.

В процессе настройки FIS автоматически изучает правила после оптимизации затрат с помощью обучающих данных. Исследуйте настроенные правила.

fisout.Rules
ans = 
  1×3 fisrule array with properties:

    Description
    Antecedent
    Consequent
    Weight
    Connection

  Details:
                   Description           
         ________________________________

    1    "input1==mf3 => output1=mf1 (1)"
    2    "input1==mf1 => output1=mf2 (1)"
    3    "input1==mf2 => output1=mf1 (1)"

Можно удалить некоторые из существующих правил и узнать дополнительные правила.

fisout.Rules(2:end) = [];
rng('default')  % for reproducibility
fisout = tunefis(fisin,[],x,y,options);
                                  Best           Mean      Stall
Generation      Func-count        f(x)           f(x)    Generations
    1              400           0.165          0.2956        0
    2              590           0.165          0.2805        1
    3              780           0.165          0.2578        2
    4              970           0.165          0.2393        3
    5             1160           0.165          0.2322        4
Optimization terminated: maximum number of generations exceeded.
fisout.Rules
ans = 
  1×3 fisrule array with properties:

    Description
    Antecedent
    Consequent
    Weight
    Connection

  Details:
                   Description           
         ________________________________

    1    "input1==mf3 => output1=mf1 (1)"
    2    "input1==mf1 => output1=mf2 (1)"
    3    "input1==mf2 => output1=mf1 (1)"

Можно также настроить предшествующие и последствия существующих правил и узнать новые правила. Для этого получите настраиваемые настройки параметра правила и передайте их в tunefis функция.

fisout.Rules(2:end) = [];
fisout.Rules(1).Antecedent = 1;
fisout.Rules(1).Consequent = 1;
[~,~,rule] = getTunableSettings(fisout);
rng('default')
fisout = tunefis(fisin,rule,x,y,options);
                                  Best           Mean      Stall
Generation      Func-count        f(x)           f(x)    Generations
    1              400           0.165          0.3063        0
    2              590           0.165          0.2845        1
    3              780           0.165          0.2549        2
    4              970           0.165          0.2344        3
    5             1160           0.165          0.2153        4
Optimization terminated: maximum number of generations exceeded.
fisout.Rules
ans = 
  1×3 fisrule array with properties:

    Description
    Antecedent
    Consequent
    Weight
    Connection

  Details:
                   Description           
         ________________________________

    1    "input1==mf1 => output1=mf2 (1)"
    2    "input1==mf2 => output1=mf1 (1)"
    3    "input1==mf3 => output1=mf1 (1)"

Настройка параметров MF и правила

Можно настроить все параметры MF и rule одновременно. Сначала получите все настройки параметра для FIS.

[in,out,rule] = getTunableSettings(fis);

Настройте опции настройки.

options = tunefisOptions('Method','ga');
options.MethodOptions.MaxGenerations = 5;

Настройте MF и параметры правила FIS.

rng('default')  % for reproducibility
fisout = tunefis(fis,[in;out;rule],x,y,options);
                                  Best           Mean      Stall
Generation      Func-count        f(x)           f(x)    Generations
    1              400           0.165           0.296        0
    2              590          0.1638          0.2821        0
    3              780          0.1625          0.2697        0
    4              970          0.1625          0.2616        1
    5             1160          0.1604          0.2512        0
Optimization terminated: maximum number of generations exceeded.

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

  1. Настройка или изучение только параметров правил.

  2. Настройка параметров MF и правила.

Правила обучения и настройки менее в вычислительном отношении дороги, чем унификация параметров MF, из-за небольшого количества параметров правила. Поэтому первый шаг быстро сходится к основе нечетких правил во время обучения. На втором этапе использование основы правил с первого шага в качестве начального условия улучшает сходимость процесса настройки параметра.

Сгенерируйте FIS из данных и настройте

Когда вы вручную создаете FIS для настройки, необходимо либо вручную создать начальную базу правил, либо изучить начальные правила. Также можно сгенерировать FIS с помощью genfis функция, которая создает начальную базу правил на основе ваших обучающих данных. Затем можно оптимизировать FIS с помощью tunefis. В этом подходе процесс настройки может использовать локальный метод оптимизации, потому что основа правил получена из обучающих данных.

Этот пример использует те же обучающие данные, что и предыдущие примеры.

Создайте опции для genfis который задает пять MF, Гауссов MF для входа и постоянный MF для выхода.

goptions = genfisOptions('GridPartition','NumMembershipFunctions',5, ...
    'InputMembershipFunctionType','gaussmf', ...
    'OutputMembershipFunctionType','constant');

Сгенерируйте начальный FIS и получите его параметры настройки.

fisin = genfis(x,y,goptions);
[in,out,rule] = getTunableSettings(fisin);

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

toptions = tunefisOptions('Method','patternsearch');
toptions.MethodOptions.MaxIterations = 25;
rng('default')
fisout = tunefis(fisin,[in;out],x,y,toptions);
Iter     Func-count       f(x)      MeshSize     Method
    0           1       0.346649             1      
    1          19       0.346649           0.5     Refine Mesh
    2          37       0.273812             1     Successful Poll
    3          38       0.236413             2     Successful Poll
    4          39       0.190794             4     Successful Poll
    5          40       0.182142             8     Successful Poll
    6          47       0.182142             4     Refine Mesh
    7          49       0.162927             8     Successful Poll
    8          56       0.162927             4     Refine Mesh
    9          67       0.162927             2     Refine Mesh
   10          69       0.159539             4     Successful Poll
   11          80       0.159539             2     Refine Mesh
   12          92       0.159539             1     Refine Mesh
   13          94       0.159421             2     Successful Poll
   14         106       0.159373             4     Successful Poll
   15         117       0.159373             2     Refine Mesh
   16         125       0.159185             4     Successful Poll
   17         136       0.159185             2     Refine Mesh
   18         151       0.159185             1     Refine Mesh
   19         152        0.15914             2     Successful Poll
   20         167        0.15914             1     Refine Mesh
   21         170       0.158914             2     Successful Poll
   22         185       0.158914             1     Refine Mesh
   23         187       0.158839             2     Successful Poll
   24         202       0.158839             1     Refine Mesh
   25         206       0.158366             2     Successful Poll
   26         215       0.158121             4     Successful Poll
Maximum number of iterations exceeded: increase options.MaxIterations.

Можно увеличить количество итераций для дальнейшей оптимизации затрат.

См. также

| |

Похожие темы