exponenta event banner

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

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

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

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

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

Дополнительные сведения о настройке FIS см. в разделе Настройка нечетких систем вывода.

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

Для FIS типа 1 и типа 2 можно задать настраиваемые параметры для входных и выходных MF и настроить значения выбранных параметров. Можно настроить параметры для любой комбинации входных и выходных MF. В этом примере показан пример рабочего процесса с использованием FIS типа 1. Для примера, который настраивает тип 2 FIS, посмотрите, Предсказывают Хаотический Временной ряд Используя Тип 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 с использованием только параметров ввода или вывода. В этом примере, поскольку для параметров вывода задано значение «Неперестраиваемый», настройка 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

Каждый параметр правила включает имя 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 и правила одновременно. Сначала получите все настройки параметров для 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.

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

См. также

| |

Связанные темы