Разработка комплексной нечеткой системы вывода (FIS) с большим количеством входных параметров и функций принадлежности (MFS) является сложной проблемой из-за большого количества параметров MF и растущего числа правил. Многообещающее решение этой проблемы состоит в том, чтобы разработать деревья FIS, которые включают иерархически соединенный модульный ФИСС, имеющий небольшое количество входных параметров. Разработка дерева FIS с соответствующими параметрами MF и правилами, однако, является трудной задачей, когда соответствующие экспертные знания не доступны для сложной системы. Следовательно, управляемый данными подход настройки и оптимизации MF и параметров правила предлагает изящное решение этой проблемы.
Можно настроить нечеткую систему с помощью команды tunefis
. Следующие данные показывают, как нечеткая система настраивается с данными тренировки ввода/вывода. Настраивающий процесс использует метод оптимизации на задаче оптимизации, созданной из нечеткой системы.
В каждой итерации метод оптимизации генерирует несколько наборов решений, которые являются значениями для выбранных параметров нечеткой системы. Нечеткая система обновляется с каждым решением и затем оценила использование входных данных тренировки. Оцененный вывод по сравнению с выходными данными тренировки, чтобы сгенерировать затраты на решения. Этот процесс продолжается для нескольких итераций, пока условие остановки не соблюдают, и затем это возвращает минимальное экономичное решение с оптимизированными нечеткими системными параметрами. Для примера, который использует этот подход, смотрите Мелодию Mamdani Нечеткая Система Вывода.
Если данные тренировки ввода/вывода не доступны, можно использовать пользовательскую модель вместо данных тренировки, чтобы оценить нечеткую систему для измерения стоимости. Этот подход показывают в следующей фигуре.
В этом случае пользовательская модель использует нечеткую систему, чтобы минимизировать стоимость достижения целей реального исполнения. Решение для параметра, которое производит лучшую производительность пользовательской модели, возвращено как результат оптимизации. Например, в модели навигации робота, цель производительности состоит в том, чтобы минимизировать расстояния, на которые путешествуют, чтобы предназначаться для положений, не сталкиваясь ни с одним из препятствий. Следовательно, модель навигации использует нечеткую систему, чтобы управлять направлением заголовка робота, чтобы достигнуть цели. Для примера, который использует этот подход, смотрите Мелодию Нечеткие Системы с помощью Пользовательской Функции стоимости.
Можно выбрать отдельный MF и управлять параметрами нечеткой системы для оптимизации.
Этот пример показывает, как задать установки параметров для каждого MF ввода и вывода 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: [1x3 fuzzy.tuning.MembershipFunctionSettings] FISName: "fis"
out = VariableSettings with properties: Type: "output" VariableName: "output1" MembershipFunctions: [1x3 fuzzy.tuning.MembershipFunctionSettings] FISName: "fis"
Установки параметров представлены объектами VariableSettings
, которые включают имя FIS, тип переменной, имя переменной и установки параметров MF. Исследуйте установки параметров 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]. Make MF 1
входа 1 ненастраиваемое.
in(1).MembershipFunctions(1) = setTunable(in(1).MembershipFunctions(1),false);
Точно так же сделайте первый параметр 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 установлены к соответствующим областям значений ввода/вывода в настраивающем процессе.
Наконец, сделайте вывод ненастраиваемым.
out = setTunable(out,false);
Теперь, когда вы сконфигурировали параметры, задайте данные тренировки ввода и вывода. Сгенерируйте некоторые данные для этого примера.
x = (0:0.1:10)'; y = abs(sin(2*x)./exp(x/5));
Задайте опции для tunefis
. Используйте генетический алгоритм для оптимизации.
options = tunefisOptions("Method","ga");
Задайте максимальные 5 поколений для оптимизации.
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 150 32.84 32.84 1 3 200 32.84 32.84 2 4 250 32.84 32.84 3 5 300 32.84 32.84 4 Optimization terminated: maximum number of generations exceeded.
fisout
включает обновленные значения параметров. optimout
обеспечивает дополнительные выходные параметры метода оптимизации и любого сообщения об ошибке, которые возвращены во время процесса обновления входа нечеткая система с помощью оптимизированных значений параметров.
optimout
optimout = struct with fields:
tuningOutputs: [1x1 struct]
errorMessage: []
optimout.tuningOutputs
ans = struct with fields:
x: [5 9.1667 5.8333 10 14.1667]
fval: 32.8363
exitflag: 0
output: [1x1 struct]
population: [50x5 double]
scores: [50x1 double]
Можно опционально настроить fis
с помощью любого ввода или вывода установки параметров. В этом примере настройки выходного параметра установлены в ненастраиваемый. Поэтому настройка fis
только с входными установками параметров приводит к тем же результатам.
rng('default')
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 150 32.84 32.84 1 3 200 32.84 32.84 2 4 250 32.84 32.84 3 5 300 32.84 32.84 4 Optimization terminated: maximum number of generations exceeded.
Обратите внимание на то, что лучшие затраты на оптимизацию, показанные в столбце 3 обоих настраивающихся результатов, являются тем же самым, которое указывает, что результаты оптимизации являются тем же самым в обоих случаях.
Можно задать только параметры правила нечеткой системы для настройки.
Используйте getTunableSettings
, чтобы получить установки параметров правила от нечеткой системы. Постановите, что установки параметров возвращены как третий выходной аргумент.
[~,~,rule] = getTunableSettings(fis)
rule = 3x1 RuleSettings array with properties: Index Antecedent Consequent FISName
Каждое правило установки параметров включает имя FIS, индекс правила в FIS и установки параметров для антецедента правила и следствия (пункт правила).
Установки параметров для пункта правила включают три опции:
Доступны ли индексы MF ввода/вывода для настройки. По умолчанию параметры пункта свободны для настройки.
Позволяет ли пункт использование НЕ логика, другими словами, позволяет ли это отрицательные индексы MF. По умолчанию правила не позволяют НЕ логику.
Позволяет ли cluase отсутствие переменных ввода/вывода, другими словами, если это позволяет нулевые индексы MF. По умолчанию отсутствие переменной позволено.
rule(1).Antecedent(1)
ans = ClauseParameters with properties: AllowNot: 0 AllowEmpty: 1 Free: 1
Позвольте НЕ логику в антецеденте правила 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 150 1.648 2.448 1 3 200 1.648 2.212 2 4 250 1.648 2.052 3 5 300 1.648 1.874 4 Optimization terminated: maximum number of generations exceeded.
Поскольку вы сделали правило 3 ненастраиваемым, можно исключить правило 3, когда вы настраиваете fis
.
rng('default') % for reproducibility 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 150 1.648 2.448 1 3 200 1.648 2.212 2 4 250 1.648 2.052 3 5 300 1.648 1.874 4 Optimization terminated: maximum number of generations exceeded.
Обратите внимание на то, что лучшие затраты на оптимизацию, показанные в столбце 3 обоих настраивающихся результатов, являются тем же самым, которое указывает, что результаты оптимизации являются тем же самым в обоих случаях.
Можно настроить нечеткую систему без любых правил в tunefis
. В этом случае установите опцию OptimizationType
tunefisOptions
к learning
так, чтобы tunefis
изучил правила для FIS.
fisin = fis;
fisin.Rules = [];
options.OptimizationType = 'learning';
Задайте максимальный размер основы правила к 3. Это значение задает максимальное количество правил в настроенном FIS.
options.NumMaxRules = 3;
Обратите внимание на то, что размер настроенной основы правила может быть меньше, чем NumMaxRules
, потому что tunefis
удаляет дублирующиеся правила из настроенного FIS. Если вы не задаете NumMaxRules
, то tunefis
добавляет максимальное количество правил, определенных комбинациями входа MFs. Комбинации входа MF по умолчанию включают нулевые индексы MF, которые позволяют отсутствие переменных. Комбинации по умолчанию исключают отрицательные индексы MF, так, чтобы НЕ логика не была позволена.
Установите 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.2973 0 2 600 0.165 0.2891 1 3 800 0.165 0.2685 2 4 1000 0.165 0.2548 3 5 1200 0.165 0.2378 4 Optimization terminated: maximum number of generations exceeded.
Во время настраивающего процесса FIS автоматически изучает правила после оптимизации стоимости с данными тренировки. Исследуйте настроенные правила.
fisout.Rules
ans = 1x3 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.2973 0 2 600 0.165 0.2891 1 3 800 0.165 0.2685 2 4 1000 0.165 0.2548 3 5 1200 0.165 0.2378 4 Optimization terminated: maximum number of generations exceeded.
fisout.Rules
ans = 1x3 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) = [];
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.3075 0 2 600 0.165 0.2738 1 3 800 0.165 0.2545 2 4 1000 0.165 0.2271 3 5 1200 0.165 0.2083 4 Optimization terminated: maximum number of generations exceeded.
fisout.Rules
ans = 1x3 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)"
Можно настроить все параметры FIS вместе.
[in,out,rule] = getTunableSettings(fis); options = tunefisOptions('Method','ga'); options.MethodOptions.MaxGenerations = 5; 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.1624 0.2997 0 2 600 0.1624 0.2776 1 3 800 0.1624 0.2653 2 4 1000 0.1592 0.2486 0 5 1200 0.1592 0.2342 1 Optimization terminated: maximum number of generations exceeded.
Для большой нечеткой системы, настраивая все параметры FIS в том же настраивающем процессе может взять несколько итераций, чтобы получить ожидаемые результаты. Следовательно, вы можете настройки параметров на двух шагах:
Настройте или изучите параметры правила только.
Настройте и MF и параметры правила.
Первый шаг является менее в вычислительном отношении дорогим из-за небольшого количества параметров правила. Это быстро сходится к нечеткой основе правила во время обучения. На втором шаге с помощью основы правила от первого шага, когда начальное условие обеспечивает быструю сходимость настраивающего процесса параметра.
Можно настроить параметры дерева FIS с помощью подобного двухступенчатого процесса для того, описанного выше для настройки FIS.
Создайте дерево FIS к модели как показано в следующей фигуре.
Создайте fis1
, когда Sugeno вводит FIS, который приводит к более быстрому настраивающему процессу из-за в вычислительном отношении эффективного defuzzification метода. Добавьте два входных параметров с областью значений [0 10] наличие трех MFS каждый. Используйте сглаженный дифференцируемый MF, такой как gaussmf
, чтобы совпадать с характеристиками типа данных, который вы моделируете.
fis1 = sugfis('Name','fis1'); fis1 = addInput(fis1,[0 10],'NumMFs',3,'MFType','gaussmf'); fis1 = addInput(fis1,[0 10],'NumMFs',3,'MFType','gaussmf');
Добавьте вывод с областью значений [–1.5 1.5] наличие девяти MFS, чтобы обеспечить максимальную гранулярность, соответствующую каждой комбинации входа MFs. Выходная область значений установлена согласно значениям .
fis1 = addOutput(fis1,[-1.5 1.5],'NumMFs',9);
Создайте fis2
, когда Sugeno вводит FIS также. Добавьте два входных параметров. Используйте [-1.5 1.5] как область значений первого входа, который является выводом fis1
. Второй вход совпадает с входными параметрами fis1
, таким образом, это также использует область значений [0 10]. Добавьте три MFS для каждых из входных параметров.
fis2 = sugfis('Name','fis2'); fis2 = addInput(fis2,[-1.5 1.5],'NumMFs',3,'MFType','gaussmf'); fis2 = addInput(fis2,[0 10],'NumMFs',3,'MFType','gaussmf');
Добавьте вывод с областью значений [0 1] наличие девяти MFS, чтобы обеспечить максимальную гранулярность, соответствующую каждой комбинации входа MFs. Выходная область значений установлена согласно значениям .
fis2 = addOutput(fis2,[0 1],'NumMFs',9);
Соедините входные параметры и выходные параметры как показано в схеме. Выведите 1 из fis1
, соединяет с входным 1 из fis2
, вводит 1, и 2 из fis1
соединяются друг с другом и вводят 2 из подключений fis1
к входному 2 из fis2
.
con1 = ["fis1/output1" "fis2/input1"]; con2 = ["fis1/input1" "fis1/input2"]; con3 = ["fis1/input2" "fis2/input2"];
Наконец, создайте дерево FIS с помощью fis1
, fis2
, con1
, con2
и con3
.
fisT = fistree([fis1 fis2],[con1;con2;con3]);
Задайте дополнительный вывод к дереву FIS, чтобы получить доступ к выводу fis1
.
fisT.Outputs = ["fis1/output1";fisT.Outputs];
Сгенерируйте данные тренировки ввода и вывода.
x = (0:0.1:10)'; y1 = sin(x)+cos(x); y2 = y1./exp(x); y = [y1 y2];
Настройте древовидные параметры FIS на двух шагах. Во-первых, используйте глобальный метод оптимизации, такой как рой частицы или генетический алгоритм, чтобы изучить правила дерева FIS. Создайте опции tunefis
для изучения с методом particleswarm
.
options = tunefisOptions('Method','particleswarm','OptimizationType','learning');
Этот настраивающий шаг использует небольшое количество итераций, чтобы изучить основу правила, не сверхсоответствуя данным тренировки. Основа правила обеспечивает образованное начальное условие для второго шага, чтобы оптимизировать все древовидные параметры FIS вместе. Определите максимальный номер итерации к 5 и изучите основу правила.
options.MethodOptions.MaxIterations = 5; rng('default') % for reproducibility fisTout1 = tunefis(fisT,[],x,y,options);
Best Mean Stall Iteration f-count f(x) f(x) Iterations 0 100 0.6682 0.9395 0 1 200 0.6682 1.023 0 2 300 0.6652 0.9308 0 3 400 0.6259 0.958 0 4 500 0.6259 0.918 1 5 600 0.5969 0.9179 0 Optimization ended: number of iterations exceeded OPTIONS.MaxIterations.
Чтобы настроить все древовидные параметры FIS, второй шаг использует локальный метод оптимизации, такой как поиск шаблона или метод отжига симуляции. Локальная оптимизация обычно быстрее, чем глобальная оптимизация и может привести к лучшим результатам, когда вход нечеткие системные параметры уже сопоставим с данными тренировки.
Используйте метод patternsearch
для оптимизации. Определите номер итераций к 25.
options.Method = 'patternsearch';
options.MethodOptions.MaxIterations = 25;
Используйте getTunableSettings
, который будет введен, выведен, и управляйте установками параметров от fisTout1
.
[in,out,rule] = getTunableSettings(fisTout1);
Настройте все древовидные параметры FIS.
rng('default') % for reproducibility fisTout2 = tunefis(fisTout1,[in;out;rule],x,y,options);
Iter Func-count f(x) MeshSize Method 0 1 0.596926 1 1 3 0.551284 2 Successful Poll 2 13 0.548551 4 Successful Poll 3 20 0.546331 8 Successful Poll 4 33 0.527482 16 Successful Poll 5 33 0.527482 8 Refine Mesh 6 61 0.511532 16 Successful Poll 7 61 0.511532 8 Refine Mesh 8 92 0.505355 16 Successful Poll 9 92 0.505355 8 Refine Mesh 10 128 0.505355 4 Refine Mesh 11 175 0.487734 8 Successful Poll 12 212 0.487734 4 Refine Mesh 13 265 0.487734 2 Refine Mesh 14 275 0.486926 4 Successful Poll 15 328 0.486926 2 Refine Mesh 16 339 0.483683 4 Successful Poll 17 391 0.483683 2 Refine Mesh 18 410 0.442624 4 Successful Poll 19 462 0.442624 2 Refine Mesh 20 469 0.44051 4 Successful Poll 21 521 0.44051 2 Refine Mesh 22 542 0.435381 4 Successful Poll 23 594 0.435381 2 Refine Mesh 24 614 0.398872 4 Successful Poll 25 662 0.398385 8 Successful Poll 26 698 0.398385 4 Refine Mesh Maximum number of iterations exceeded: increase options.MaxIterations.
Стоимость оптимизации уменьшает с 0,59 до 0,39 на втором шаге.
Можно настроить определенные нечеткие системы в дереве FIS. Чтобы получить установки параметров определенных нечетких систем, используйте getTunableSettings
. Например, после изучения основы правила предыдущего дерева FIS, отдельно настройте параметры fis2
и fis1
. Во-первых, получите установки параметров для fis1
.
[in,out,rule] = getTunableSettings(fisTout1,"FIS","fis1");
Настройте параметры fis1
дерева.
rng('default')
fisTout2 = tunefis(fisTout1,[in;out;rule],x,y,options);
Iter Func-count f(x) MeshSize Method 0 1 0.596926 1 1 3 0.551284 2 Successful Poll 2 18 0.510362 4 Successful Poll 3 28 0.494804 8 Successful Poll 4 56 0.494804 4 Refine Mesh 5 84 0.493422 8 Successful Poll 6 107 0.492883 16 Successful Poll 7 107 0.492883 8 Refine Mesh 8 136 0.492883 4 Refine Mesh 9 171 0.492883 2 Refine Mesh 10 178 0.491534 4 Successful Poll 11 213 0.491534 2 Refine Mesh 12 229 0.482682 4 Successful Poll 13 264 0.482682 2 Refine Mesh 14 279 0.446645 4 Successful Poll 15 313 0.446645 2 Refine Mesh 16 330 0.44657 4 Successful Poll 17 364 0.44657 2 Refine Mesh 18 384 0.446495 4 Successful Poll 19 418 0.446495 2 Refine Mesh 20 461 0.445938 4 Successful Poll 21 495 0.445938 2 Refine Mesh 22 560 0.422421 4 Successful Poll 23 594 0.422421 2 Refine Mesh 24 597 0.397265 4 Successful Poll 25 630 0.397265 2 Refine Mesh 26 701 0.390338 4 Successful Poll Maximum number of iterations exceeded: increase options.MaxIterations.
В этом случае стоимость оптимизации улучшена путем настройки только значений параметров fis1
.
Затем, получите настройки параметра для fis2
и настройте параметры fis2
.
[in,out,rule] = getTunableSettings(fisTout2,"FIS","fis2"); rng('default') fisTout3 = tunefis(fisTout2,[in;out;rule],x,y,options);
Iter Func-count f(x) MeshSize Method 0 1 0.390338 1 1 2 0.374103 2 Successful Poll 2 5 0.373855 4 Successful Poll 3 10 0.356619 8 Successful Poll 4 33 0.356619 4 Refine Mesh 5 43 0.350715 8 Successful Poll 6 65 0.349417 16 Successful Poll 7 65 0.349417 8 Refine Mesh 8 87 0.349417 4 Refine Mesh 9 91 0.349356 8 Successful Poll 10 112 0.349356 4 Refine Mesh 11 138 0.346102 8 Successful Poll 12 159 0.346102 4 Refine Mesh 13 172 0.345938 8 Successful Poll 14 193 0.345938 4 Refine Mesh 15 222 0.342721 8 Successful Poll 16 244 0.342721 4 Refine Mesh 17 275 0.342721 2 Refine Mesh 18 283 0.340727 4 Successful Poll 19 312 0.340554 8 Successful Poll 20 335 0.340554 4 Refine Mesh 21 366 0.340554 2 Refine Mesh 22 427 0.337873 4 Successful Poll 23 457 0.337873 2 Refine Mesh 24 521 0.33706 4 Successful Poll 25 551 0.33706 2 Refine Mesh 26 624 0.333193 4 Successful Poll Maximum number of iterations exceeded: increase options.MaxIterations.
Стоимость оптимизации далее уменьшается путем настройки значений параметров fis2
. Чтобы постараться не сверхсоответствовать отдельных значений параметров FIS, можно далее настроить и fis1
и параметры fis2
вместе.
[in,out,rule] = getTunableSettings(fisTout3);
rng('default')
fisTout4 = tunefis(fisTout3,[in;out;rule],x,y,options);
Iter Func-count f(x) MeshSize Method 0 1 0.333193 1 1 8 0.326804 2 Successful Poll 2 91 0.326432 4 Successful Poll 3 116 0.326261 8 Successful Poll 4 154 0.326261 4 Refine Mesh 5 205 0.326261 2 Refine Mesh 6 302 0.326092 4 Successful Poll 7 352 0.326092 2 Refine Mesh 8 391 0.325964 4 Successful Poll 9 441 0.325964 2 Refine Mesh 10 478 0.32578 4 Successful Poll 11 528 0.32578 2 Refine Mesh 12 562 0.325691 4 Successful Poll 13 612 0.325691 2 Refine Mesh 14 713 0.229273 4 Successful Poll 15 763 0.229273 2 Refine Mesh 16 867 0.22891 4 Successful Poll 17 917 0.22891 2 Refine Mesh 18 1036 0.228688 4 Successful Poll 19 1086 0.228688 2 Refine Mesh 20 1212 0.228688 1 Refine Mesh 21 1266 0.228445 2 Successful Poll 22 1369 0.228441 4 Successful Poll 23 1381 0.227645 8 Successful Poll 24 1407 0.226125 16 Successful Poll 25 1407 0.226125 8 Refine Mesh 26 1447 0.226125 4 Refine Mesh Maximum number of iterations exceeded: increase options.MaxIterations.
В целом, стоимость оптимизации уменьшает с 0,59 до 0,22 на трех шагах.
Предположим, что вы хотите изменить предыдущее дерево FIS как показано в следующей схеме.
Создайте дерево FIS.
fis1 = sugfis('Name','fis1'); fis1 = addInput(fis1,[0 10],'NumMFs',3,'MFType','gaussmf'); fis1 = addOutput(fis1,[-1 1],'NumMFs',3); fis2 = sugfis('Name','fis2'); fis2 = addInput(fis2,[0 10],'NumMFs',3,'MFType','gaussmf'); fis2 = addOutput(fis2,[-1 1],'NumMFs',3); fis3 = sugfis('Name','fis3'); fis3 = addInput(fis3,[0 10],'NumMFs',3,'MFType','gaussmf'); fis3 = addOutput(fis3,[0 1],'NumMFs',3); con = ["fis1/input1" "fis2/input1";"fis2/input1" "fis3/input1"]; fisT = fistree([fis1 fis2 fis3],con);
Чтобы реализовать операции сложения и умножения, используйте пользовательскую функцию стоимости. В данном примере используйте функциональный customcostfcn
, включенный в конце примера. Изучите основу правила с этой функцией стоимости.
options.Method = 'particleswarm'; options.MethodOptions.MaxIterations = 5; rng('default') fisTout1 = tunefis(fisT,[],@(fis)customcostfcn(fis,x,y),options);
Best Mean Stall Iteration f-count f(x) f(x) Iterations 0 100 0.746 1.318 0 1 200 0.5787 1.236 0 2 300 0.5787 1.104 1 3 400 0.5787 1.097 0 4 500 0.5171 1.155 0 5 600 0.5171 1.067 1 Optimization ended: number of iterations exceeded OPTIONS.MaxIterations.
Настройте все параметры дерева FIS.
options.Method = 'patternsearch'; options.MethodOptions.MaxIterations = 25; [in,out,rule] = getTunableSettings(fisTout1); rng('default') fisTout2 = tunefis(fisTout1,[in;out;rule],@(fis)customcostfcn(fis,x,y),options);
Iter Func-count f(x) MeshSize Method 0 1 0.51705 1 1 11 0.514884 2 Successful Poll 2 21 0.512873 4 Successful Poll 3 43 0.512873 8 Successful Poll 4 56 0.512873 4 Refine Mesh 5 79 0.512873 2 Refine Mesh 6 106 0.512869 4 Successful Poll 7 129 0.512869 2 Refine Mesh 8 174 0.512869 1 Refine Mesh 9 197 0.512862 2 Successful Poll 10 242 0.512862 1 Refine Mesh 11 314 0.512862 0.5 Refine Mesh 12 388 0.512862 0.25 Refine Mesh 13 422 0.510163 0.5 Successful Poll 14 429 0.509153 1 Successful Poll 15 439 0.509034 2 Successful Poll 16 460 0.509034 4 Successful Poll 17 483 0.507555 8 Successful Poll 18 495 0.507555 4 Refine Mesh 19 519 0.507555 2 Refine Mesh 20 565 0.507555 1 Refine Mesh 21 636 0.507555 2 Successful Poll 22 682 0.507555 1 Refine Mesh 23 755 0.507555 0.5 Refine Mesh 24 799 0.507554 1 Successful Poll 25 872 0.507554 0.5 Refine Mesh 26 947 0.507554 0.25 Refine Mesh Maximum number of iterations exceeded: increase options.MaxIterations.
Можно добавить больше MFS ввода/вывода и задать дополнительные древовидные выходные параметры FIS, чтобы улучшать настраивающуюся производительность. Используя дополнительные параметры MF и больше данных тренировки для дополнительных древовидных выходных параметров FIS может далее точно настроить выходные параметры fis1
, fis2
и fis3
.
Можно реализовать собственный метод оптимизации параметров управления FIS с помощью getTunableSettings
, getTunableValues
и setTunableValues
. Этот пример использует эти функции, чтобы настроить основу правила нечеткой системы.
Создайте FIS, чтобы аппроксимировать , где отличается от 0 до .
fisin = mamfis;
Добавьте вход с областью значений [0 ] наличие пяти MFS Гауссова типа и вывода с областью значений [–1 1] наличие пяти MFS Гауссова типа.
fisin = addInput(fisin,[0 2*pi],'NumMFs',5,'MFType','gaussmf'); fisin = addOutput(fisin,[-1 1],'NumMFs',5,'MFType','gaussmf');
Добавьте 5 правил.
fisin = addRule(fisin,[1 1 1 1;2 2 1 1;3 3 1 1;4 4 1 1;5 5 1 1]); fisin.Rules
ans = 1x5 fisrule array with properties: Description Antecedent Consequent Weight Connection Details: Description ________________________________ 1 "input1==mf1 => output1=mf1 (1)" 2 "input1==mf2 => output1=mf2 (1)" 3 "input1==mf3 => output1=mf3 (1)" 4 "input1==mf4 => output1=mf4 (1)" 5 "input1==mf5 => output1=mf5 (1)"
Установите DisableStructuralChecks
на истину для быстрее обновления FIS.
fisin.DisableStructuralChecks = true;
Получите установки параметров правила.
[~,~,rule] = getTunableSettings(fisin);
Сделайте антецедент ненастраиваемым. В следствии не позволяйте НЕ логику (отрицательные индексы MF) или пустые переменные (нулевые индексы MF) в правилах.
for i = 1:numel(rule) rule(i).Antecedent.Free = false; rule(i).Consequent.AllowNot = false; rule(i).Consequent.AllowEmpty = false; end
Сгенерируйте данные для настройки.
x = (0:0.1:2*pi)'; y = sin(x);
Чтобы настроить параметры правила, используйте функцию, определяемую customtunefis
в конце этого примера. Определите номер итераций к 2 и не позволяйте значения недопустимого параметра при обновлении FIS использование setTunableValues
.
numite = 2; ignoreinvp = false; fisout = customtunefis(fisin,rule,x,y,numite,ignoreinvp);
Initial cost = 1.170519 Iteration 1: Cost = 0.241121 Iteration 2: Cost = 0.241121
Отобразите настроенные правила.
fisout.Rules
ans = 1x5 fisrule array with properties: Description Antecedent Consequent Weight Connection Details: Description ________________________________ 1 "input1==mf1 => output1=mf4 (1)" 2 "input1==mf2 => output1=mf5 (1)" 3 "input1==mf3 => output1=mf3 (1)" 4 "input1==mf4 => output1=mf1 (1)" 5 "input1==mf5 => output1=mf2 (1)"
Позвольте НЕ логику в правилах и оптимизируйте FIS снова.
for i = 1:numel(rule) rule(i).Consequent.AllowNot = true; end fisout = customtunefis(fisin,rule,x,y,numite,ignoreinvp);
Initial cost = 1.170519 Iteration 1: Cost = 0.357052 Iteration 2: Cost = 0.241121
fisout.Rules
ans = 1x5 fisrule array with properties: Description Antecedent Consequent Weight Connection Details: Description ________________________________ 1 "input1==mf1 => output1=mf4 (1)" 2 "input1==mf2 => output1=mf5 (1)" 3 "input1==mf3 => output1=mf3 (1)" 4 "input1==mf4 => output1=mf1 (1)" 5 "input1==mf5 => output1=mf2 (1)"
С НЕ логика, существует больше комбинаций параметров правила, и обычно требуется больше итераций, чтобы настроить FIS.
Затем, сбросьте AllowNot
к false
и установите AllowEmpty
на true
, другими словами, позвольте отсутствие переменных (обнулите индексы вывода MF) в следствии. Настройте FIS с обновленными установками параметров правила.
for i = 1:numel(rule) rule(i).Consequent.AllowNot = false; rule(i).Consequent.AllowEmpty = true; end try fisout = customtunefis(fisin,rule,x,y,numite,ignoreinvp); catch me disp("Error: "+me.message) end
Initial cost = 1.170519 Error: Rule consequent must have at least one nonzero membership function index.
Настраивающие сбои процесса начиная с FIS только содержат тот вывод, который должен быть ненулевой (непустой) в следствии правила. Чтобы проигнорировать значения недопустимого параметра, задайте IgnoreInvalidParameters
с setTunableValues
.
Установите ignoreinvp
на true
, который задает значение IgnoreInvalidParameters
в вызове setTunableValues
, используемого в customtunefis
.
ignoreinvp = true; fisout = customtunefis(fisin,rule,x,y,numite,ignoreinvp);
Initial cost = 1.170519 Iteration 1: Cost = 0.241121 Iteration 2: Cost = 0.241121
fisout.Rules
ans = 1x5 fisrule array with properties: Description Antecedent Consequent Weight Connection Details: Description ________________________________ 1 "input1==mf1 => output1=mf4 (1)" 2 "input1==mf2 => output1=mf5 (1)" 3 "input1==mf3 => output1=mf3 (1)" 4 "input1==mf4 => output1=mf1 (1)" 5 "input1==mf5 => output1=mf2 (1)"
В этом случае настраивающий процесс обходит недопустимые значения и использует только допустимые значения параметров для оптимизации.
По умолчанию tunefis
игнорирует недопустимые значения при обновлении нечетких системных параметров. Можно изменить это поведение установкой tunefisOptions.IgnoreInvalidParameters
к false
.
Можно сгенерировать FIS от данных тренировки с помощью genfis
и затем оптимизировать FIS с tunefis
. В этом подходе настраивающий процесс может использовать локальный метод оптимизации, потому что основа правила выведена от данных тренировки.
Этот пример описывает настраивающиеся шаги, чтобы аппроксимировать функцию
,
где вход отличается от 0 до 10.
Сгенерируйте данные тренировки.
x = (0:0.1:10)'; y = sin(2*x)./exp(x/5);
Создайте опции для genfis
, которые задают пять MFS, Гауссов 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 28 0.295219 1 Successful Poll 3 34 0.295069 2 Successful Poll 4 48 0.295069 1 Refine Mesh 5 56 0.295064 2 Successful Poll 6 71 0.294986 4 Successful Poll 7 82 0.294986 2 Refine Mesh 8 98 0.294986 1 Refine Mesh 9 112 0.293922 2 Successful Poll 10 128 0.293922 1 Refine Mesh 11 131 0.29151 2 Successful Poll 12 144 0.290141 4 Successful Poll 13 156 0.290141 2 Refine Mesh 14 171 0.290006 4 Successful Poll 15 184 0.290006 2 Refine Mesh 16 200 0.290006 1 Refine Mesh 17 207 0.289743 2 Successful Poll 18 223 0.289743 1 Refine Mesh 19 243 0.289743 0.5 Refine Mesh 20 257 0.286935 1 Successful Poll 21 260 0.282278 2 Successful Poll 22 263 0.281878 4 Successful Poll 23 267 0.280144 8 Successful Poll 24 272 0.280144 4 Refine Mesh 25 278 0.275167 8 Successful Poll 26 284 0.275167 4 Refine Mesh Maximum number of iterations exceeded: increase options.MaxIterations.
Можно увеличить число итераций, чтобы далее оптимизировать стоимость.
Чтобы постараться не сверхсоответствовать обучающих наборов данных, проверяйте производительность обученной нечеткой системы с данными о валидации. Один общий подход должен разделить доступные данные на наборы данных обучения и валидации так, чтобы оба набора данных включали подобные характеристики.
Если обучение и производительность валидации значительно отличаются, вы можете:
Измените максимальное количество настраивающихся итераций. Например, если учебная производительность лучше, чем производительность валидации, можно сократить количество настраивающихся итераций.
Передискретизируйте наборы данных обучения и валидации, чтобы поддержать однородность.
Чтобы видеть, как производительность валидации может отличаться на основе неоднородной выборки, создайте один вход один вывод нечеткая система вывода, чтобы смоделировать функцию
,
где вход отличается от 0 до 10, и выходная область значений [0 1]. Добавьте пять MFS по умолчанию во ввод и вывод. Получите установки параметров ввода и вывода.
fisin = sugfis; fisin = addInput(fisin,[0 10],'NumMFs',5,'MFType','gaussmf'); fisin = addOutput(fisin,[0 1],'NumMFs',5); [in,out] = getTunableSettings(fisin);
Создайте опции tunefis
для learning
с методом оптимизации particleswarm
и определите максимальный номер итераций к 5.
options = tunefisOptions('Method','particleswarm','OptimizationType','learning'); options.MethodOptions.MaxIterations = 5;
Разделите доступные данные на два набора, не поддерживая однородность в наборах данных.
x = (0:0.1:10)'; n = numel(x); midn = floor(n/2); trnX = x(1:midn); vldX = x(midn+1:end); f = @(x)(sin(2*x)./exp(x/5)); trnY = f(trnX); vldY = f(vldX);
Настройте параметры FIS.
rng('default')
fisout = tunefis(fisin,[in;out],trnX,trnY,options);
Best Mean Stall Iteration f-count f(x) f(x) Iterations 0 100 0.4279 0.5932 0 1 200 0.3846 0.6183 0 2 300 0.3751 0.5675 0 3 400 0.3606 0.568 0 4 500 0.3606 0.5596 1 5 600 0.3598 0.5307 0 Optimization ended: number of iterations exceeded OPTIONS.MaxIterations.
Найдите оптимизацию стоившей за данные о валидации с помощью функции, определяемой findcost
в конце этого примера.
vldCost = findcost(fisout,vldX,vldY)
vldCost = 0.1780
Обратите внимание на то, что стоимость валидации отличается от лучшей стоимости обучения, показанной в столбце 3 настраивающегося результата.
Затем, передискретизируйте доступные данные и создайте два однородных набора данных для обучения и валидации.
trnX = x(1:2:end); vldX = x(2:2:end); f = @(x)(sin(2*x)./exp(x/5)); trnY = f(trnX); vldY = f(vldX);
Настройте FIS с новыми данными тренировки.
rng('default')
fisout = tunefis(fisin,[in;out],trnX,trnY,options);
Best Mean Stall Iteration f-count f(x) f(x) Iterations 0 100 0.3445 0.5852 0 1 200 0.2996 0.5616 0 2 300 0.2907 0.5381 0 3 400 0.2878 0.5334 0 4 500 0.2878 0.5624 1 5 600 0.2877 Inf 0 Optimization ended: number of iterations exceeded OPTIONS.MaxIterations.
Найдите оптимизацию стоившей за новые данные о валидации.
vldCost = findcost(fisout,vldX,vldY)
vldCost = 0.2803
В этом случае однородная выборка уменьшает различие между затратами на обучение и валидацию.
Можно улучшить учебную ошибку настроенные нечеткие системы следующим эти инструкции.
Используйте несколько шагов в настраивающем процессе. Например, сначала изучите правила нечеткой системы, и затем настройте параметры MF ввода/вывода с помощью изученной основы правила. Можно также отдельно настроить отдельные параметры FIS в дереве FIS и затем настроить все нечеткие системы вместе, чтобы обобщить значения параметров.
Увеличьте число итераций и в изучающих правило и в настраивающих параметр фазах. Выполнение так увеличивает длительность процесса оптимизации. Это может также увеличить ошибку валидации из-за сверхнастроенных системных параметров с данными тренировки.
Используйте глобальные методы оптимизации, такие как ga
и particleswarm
, и в изучающих правило и в настраивающих параметр фазах. Глобальные оптимизаторы ga
и particleswarm
выполняют лучше для больших диапазонов настройки параметра, чем локальные оптимизаторы. Локальные оптимизаторы patternsearch
и simulannealbnd
выполняют лучше для маленьких областей значений параметра. Если правила уже добавляются к дереву FIS с помощью данных тренировки, то patternsearch
и simulannealbnd
могут произвести более быструю сходимость по сравнению с ga
и particleswarm
. Для получения дополнительной информации об этих методах оптимизации и их опциях, смотрите ga
, particleswarm
, patternsearch
и simulannealbnd
.
Измените кластеризирующийся метод, используемый genfis
. В зависимости от кластеризирующегося метода сгенерированные правила могут отличаться по своему представлению данных тренировки. Следовательно, использование различных методов кластеризации может влиять на производительность tunefis
.
Свойства Change FIS. Попытайтесь изменить свойства, такие как тип FIS, количество входных параметров, количество MFS ввода/вывода, типов MF и количества правил. Система Sugeno имеет меньше параметров вывода MF (принимающий постоянный MFS) и быстрее defuzzification. Поэтому для нечетких систем с большим количеством входных параметров, Sugeno FIS обычно сходится быстрее, чем Mamdani FIS. Небольшие числа MFS и правил сокращают количество параметров, чтобы настроиться, производя более быстрый настраивающий процесс. Кроме того, большое количество правил может сверхсоответствовать данным тренировки.
Измените настройки настраиваемого параметра для MFS и правил. Например, можно настроить поддержку треугольного MF, не изменяя его пиковое местоположение. Выполнение так сокращает количество настраиваемых параметров и может произвести более быстрый настраивающий процесс для определенных приложений. Для правил можно исключить нулевые индексы MF путем установки AllowEmpty
настраиваемая установка на false
, который сокращает общее количество правил во время фазы изучения.
Измените древовидные свойства FIS, такие как количество нечетких систем и связей между нечеткими системами.
Используйте различный рейтинг и группировку входных параметров к дереву FIS. Для получения дополнительной информации о создании деревьев FIS, смотрите Нечеткие Деревья.
function cost = customcostfcn(fis,x,y) tY = evalfis(fis,x); sincosx = tY(:,1)+tY(:,2); sincosexpx = sincosx.*tY(:,3); actY = [sincosx;sincosexpx]; d = y(:)-actY; cost = sqrt(mean(d.*d)); end function fis = customtunefis(fis,rule,x,y,n,ignore) % Show initial cost. cost = findcost(fis,x,y); fprintf('Initial cost = %f\n',cost); % Optimize rule parameters. numMFs = numel(fis.Outputs.MembershipFunctions); for ite = 1:n for i = 1:numel(rule) % Get consequent value. pval = getTunableValues(fis,rule(i)); % Loop through output MF indices to minimize the cost. % Use output indices according to AllowNot and AllowEmpty. allowNot = rule(i).Consequent.AllowNot; allowEmpty = rule(i).Consequent.AllowEmpty; if allowNot && allowEmpty mfID = -numMFs:numMFs; elseif allowNot && ~allowEmpty mfID = [-numMFs:-1 1:numMFs]; elseif ~allowNot && allowEmpty mfID = 0:numMFs; else mfID = 1:numMFs; end cost = 1000; minCostFIS = fis; for j = 1:length(mfID) % Update consequent value. pval(1) = mfID(j); % Set updated consequent value to the FIS. fis = setTunableValues(fis,rule(i),pval,'IgnoreInvalidParameters',ignore); % Evaluate cost. rmse = findcost(fis,x,y); % Update FIS with the minimum cost. if rmse<cost cost = rmse; minCostFIS = fis; end end fis = minCostFIS; end fprintf('Iteration %d: Cost = %f\n',ite,cost); end end function cost = findcost(fis,x,y) actY = evalfis(fis,x); d = y - actY; cost = sqrt(mean(d.*d)); end
genfis
| getTunableSettings
| tunefis