В этом примере показано, как настроить систему нечеткого вывода (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);
Задайте входные и выходные обучающие данные. В данном примере сгенерируйте обучающие данные с помощью следующей функции.
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 и 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 в том же процессе настройки, получение ожидаемых результатов может занять несколько итераций. Чтобы улучшить время настройки, можно настроить параметры, используя следующие два шага.
Настройка или изучение только параметров правил.
Настройка параметров MF и правила.
Правила обучения и настройки менее в вычислительном отношении дороги, чем унификация параметров MF, из-за небольшого количества параметров правила. Поэтому первый шаг быстро сходится к основе нечетких правил во время обучения. На втором этапе использование основы правил с первого шага в качестве начального условия улучшает сходимость процесса настройки параметра.
Когда вы вручную создаете 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.
Можно увеличить количество итераций для дальнейшей оптимизации затрат.
genfis
| getTunableSettings
| tunefis