anfis

Настройка системы нечеткого вывода Sugeno-типа с помощью обучающих данных

Описание

пример

fis = anfis(trainingData) генерирует одну систему нечеткого вывода Sugeno (FIS) и настраивает системные параметры, используя указанные обучающие данные ввода/вывода. Объект FIS автоматически генерируется с помощью разделения сетки.

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

пример

fis = anfis(trainingData,options) настраивает FIS с помощью заданных обучающих данных и опций. Используя этот синтаксис, можно задать:

  • Начальный объект FIS для настройки.

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

  • Опции алгоритма настройки.

  • Отображать ли информацию о процессе обучения.

пример

[fis,trainError] = anfis(___) возвращает среднеквадратическую ошибку обучения для каждой эпохи обучения.

пример

[fis,trainError,stepSize] = anfis(___) возвращает размер шага обучения в каждую эпоху обучения.

пример

[fis,trainError,stepSize,chkFIS,chkError] = anfis(trainingData,options) возвращает ошибку данных валидации для каждой эпохи обучения, chkError, и настроенный объект FIS, для которого ошибка валидации минимальна, chkFIS. Чтобы использовать этот синтаксис, необходимо задать данные валидации с помощью options.ValidationData.

Примеры

свернуть все

Загрузите обучающие данные. Эти данные имеют один вход и один выход.

load fuzex1trnData.dat

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

fis = anfis(fuzex1trnData);
ANFIS info:
	Number of nodes: 12
	Number of linear parameters: 4
	Number of nonlinear parameters: 6
	Total number of parameters: 10
	Number of training data pairs: 25
	Number of checking data pairs: 0
	Number of fuzzy rules: 2


Start training ANFIS ...

1 	 0.229709
2 	 0.22896
3 	 0.228265
4 	 0.227624
Step size increases to 0.011000 after epoch 5.
5 	 0.227036
6 	 0.2265
7 	 0.225968
8 	 0.225488
Step size increases to 0.012100 after epoch 9.
9 	 0.225052
10 	 0.22465

Designated epoch number reached. ANFIS training completed at epoch 10.

Minimal training RMSE = 0.22465

Постройте график выходов и обучающих данных ANFIS.

x = fuzex1trnData(:,1);
anfisOutput = evalfis(fis,x);
plot(x,fuzex1trnData(:,2),'*r',x,anfisOutput,'.b')
legend('Training Data','ANFIS Output','Location','NorthWest')

Figure contains an axes. The axes contains 2 objects of type line. These objects represent Training Data, ANFIS Output.

Данные ANFIS плохо соответствуют обучающим данным. Для улучшения матча:

  • Увеличение числа функций членства в структуре FIS до 4. Это добавляет в систему нечеткие правила и настраиваемые параметры.

  • Увеличьте количество циклов обучения.

opt = anfisOptions('InitialFIS',4,'EpochNumber',40);

Подавить ошибку и размер шага отображение Командного окна.

opt.DisplayErrorValues = 0;
opt.DisplayStepSize = 0;

Обучите FIS.

fis = anfis(fuzex1trnData,opt);
ANFIS info:
	Number of nodes: 20
	Number of linear parameters: 8
	Number of nonlinear parameters: 12
	Total number of parameters: 20
	Number of training data pairs: 25
	Number of checking data pairs: 0
	Number of fuzzy rules: 4

Minimal training RMSE = 0.0833853

Постройте график выходов и обучающих данных ANFIS.

figure
anfisOutput = evalfis(fis,x);
plot(x,fuzex1trnData(:,2),'*r',x,anfisOutput,'.b')
legend('Training Data','ANFIS Output','Location','NorthWest')

Figure contains an axes. The axes contains 2 objects of type line. These objects represent Training Data, ANFIS Output.

Соответствие между обучающими данными и выходами ANFIS улучшилось.

Создайте обучающие данные с одним входом, с одним выходом.

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

Определите начальную структуру FIS с пятью функциями принадлежности к Гауссову входу.

genOpt = genfisOptions('GridPartition');
genOpt.NumMembershipFunctions = 5;
genOpt.InputMembershipFunctionType = 'gaussmf';
inFIS = genfis(x,y,genOpt);

Настройте опции обучения ANFIS. Установите начальный FIS и подавьте отображение процесса обучения.

opt = anfisOptions('InitialFIS',inFIS);
opt.DisplayANFISInformation = 0;
opt.DisplayErrorValues = 0;
opt.DisplayStepSize = 0;
opt.DisplayFinalResults = 0;

Обучите FIS с помощью заданных опций.

outFIS = anfis([x y],opt);

Сравните выходы ANFIS с обучающими данными.

plot(x,y,x,evalfis(outFIS,x))
legend('Training Data','ANFIS Output')

Figure contains an axes. The axes contains 2 objects of type line. These objects represent Training Data, ANFIS Output.

Загрузите обучающие данные. Эти данные имеют один вход и один выход.

load fuzex2trnData.dat

Задайте опции обучения.

opt = anfisOptions('InitialFIS',4,'EpochNumber',40);
opt.DisplayANFISInformation = 0;
opt.DisplayErrorValues = 0;
opt.DisplayStepSize = 0;
opt.DisplayFinalResults = 0;

Обучите FIS и верните ошибку обучения.

[fis,trainError] = anfis(fuzex2trnData,opt);

trainError содержит корневую среднюю квадратичную невязку для обучающих данных в каждую эпоху обучения. Ошибка обучения для fis - минимальное значение в trainError.

fisRMSE = min(trainError)
fisRMSE = 0.2572

Создайте обучающие данные с одним входом, с одним выходом.

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

Настройте опции обучения ANFIS. Установите начальный FIS и подавьте отображение процесса обучения.

opt = anfisOptions('InitialFIS',4,'EpochNumber',60);
opt.DisplayANFISInformation = 0;
opt.DisplayErrorValues = 0;
opt.DisplayStepSize = 0;
opt.DisplayFinalResults = 0;

Большая скорость увеличения размера шага может сделать обучение сходиться быстрее. Однако увеличение слишком большой скорости увеличения размера шага может привести к плохой сходимости. В данном примере попробуйте удвоить скорость увеличения размера шага.

opt.StepSizeIncreaseRate = 2*opt.StepSizeIncreaseRate;

Обучите FIS и верните массив размера шага.

[fis,~,stepSize] = anfis([x y],opt);

Постройте график профиля размера шага. Оптимальный профиль размера шага должен первоначально увеличиться, достичь максимума, а затем уменьшиться для остальной части обучения.

figure
plot(stepSize)

Figure contains an axes. The axes contains an object of type line.

Загрузите обучающие данные.

load fuzex1trnData.dat

Загрузите данные валидации.

load fuzex1chkData.dat

Задайте следующие опции обучения:

  • 4 входные функции

  • 30 эпохи обучения

  • Подавить отображение процесса обучения

opt = anfisOptions('InitialFIS',4,'EpochNumber',30);
opt.DisplayANFISInformation = 0;
opt.DisplayErrorValues = 0;
opt.DisplayStepSize = 0;
opt.DisplayFinalResults = 0;

Добавьте данные валидации к опциям обучения.

opt.ValidationData = fuzex1chkData;

Обучите FIS и верните результаты валидации.

[fis,trainError,stepSize,chkFIS,chkError] = anfis(fuzex1trnData,opt);

Ошибка обучения, trainError, и ошибка валидации, chkErrorкаждые массивы содержат по одному значению ошибки на каждую эпоху обучения. Постройте график ошибки обучения и ошибки валидации.

x = [1:30];
plot(x,trainError,'.b',x,chkError,'*r')

Figure contains an axes. The axes contains 2 objects of type line.

Минимальная ошибка валидации происходит в эпоху 17. Увеличение ошибки валидации после этой точки указывает на сверхподбор кривой параметров модели к обучающим данным. Поэтому настроенная FIS в эпоху 17, chkFIS, демонстрирует лучшую эффективность обобщения.

Входные параметры

свернуть все

Обучающие данные, заданные как массив. Для нечеткой системы с N входами задайте trainingData как массив с N + 1 столбцами. Первые столбцы N содержат входные данные, а конечный - выходные данные. Каждая строка trainingData содержит одну точку данных.

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

Опции обучения, заданные как anfisOptions набор опций. Использование options, можно задать:

  • Исходная структура FIS для настройки, options.InitialFIS.

  • Данные валидации для предотвращения сверхподбора кривой к обучающим данным, options.ValidationData.

  • Алгоритм настройки опции, такие как максимальное количество циклов обучения, options.EpochNumber, или цель ошибки обучения, options.ErrorGoal.

  • Отображать ли информацию о процессе обучения, например значения ошибок обучения для каждой эпохи обучения, options.DisplayErrorValues.

Выходные аргументы

свернуть все

Обученная система нечеткого вывода с параметрами функции принадлежности, настроенными с помощью обучающих данных, возвращенной как mamfis или sugfis объект. Эта нечеткая система соответствует эпохе, для которой ошибка обучения является наименьшей. Если две эпохи имеют одинаковую минимальную ошибку обучения, возвращается FIS из более ранней эпохи.

Корневая средняя квадратная ошибка обучения для каждой эпохи обучения, возвращенная как массив. Минимальное значение в trainError - ошибка обучения для нечеткой системы fis.

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

В идеале размер шага увеличивается в начале обучения, достигает максимума, а затем уменьшается на оставшуюся часть обучения. Чтобы достичь этого профиля размера шага, настройте начальный размер шага (options.InitialStepSize), скорость увеличения размера шага (options.StepSizeIncreaseRate) и скорость уменьшения размера шага options.StepSizeDecreaseRate.

Настроенная FIS, для которой ошибка валидации минимальна, возвращается как mamfis или sugfis объект. Если две эпохи имеют одинаковую минимальную ошибку валидации, возвращается FIS из более ранней эпохи.

chkFIS возвращается только, когда вы задаете данные валидации используя options.ValidationData.

Корневая средняя квадратная ошибка обучения, возвращенная как массив с длиной, равной количеству циклов обучения. Минимальное значение в chkError - ошибка обучения для нечеткой системы chkFIS.

chkError возвращается только, когда вы задаете данные валидации используя options.ValidationData.

Альтернативная функциональность

tunefis Функция

Начиная с R2019a, можно настроить нечеткую систему, используя tunefis. Эта функция предоставляет несколько других опций для настройки алгоритмов, заданных tunefisOptions объект.

Чтобы использовать ANFIS, задайте алгоритм настройки следующим "anfis" в tunefisOptions. Затем используйте объект опций в качестве входного параметра для tunefis. Для примера:

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

x = (0:0.1:10)';
y = sin(2*x)./exp(x/5);
options = genfisOptions('GridPartition');
options.NumMembershipFunctions = 5;
fisin = genfis(x,y,options);
[in,out,rule] = getTunableSettings(fisin);

Настройте параметры функции принадлежности с помощью "anfis".

opt = tunefisOptions("Method","anfis");
fisout = tunefis(fisin,[in;out],x,y,opt);

Вопросы совместимости

расширить все

Предупреждает, начиная с R2019b

Ссылки

[1] Джанг, Ж.-С. R., «Нечеткое моделирование с использованием обобщенных нейронных сетей и алгоритма фильтра Калмана», Proc. девятого Национального Конфедерации по искусственному интеллекту (AAAI-91). 1991 июля, с. 762-767.

[2] Джанг, Ж.-С. R., «ANFIS: Adaptive-Network Based Fuzzy Inference Systems», Транзакции IEEE по системам, человеку и кибернетике, том 23, № 3, май 1993, стр. 665-685.

Представлено до R2006a