anfis

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

Синтаксис

fis = anfis(trainingData)
fis = anfis(trainingData,options)
[fis,trainError] = anfis(___)
[fis,trainError,stepSize] = anfis(___)
[fis,trainError,stepSize,chkFIS,chkError] = anfis(trainingData,options)

Описание

пример

fis = anfis(trainingData) генерирует нечеткую систему вывода (FIS) Sugeno одно вывода и настраивает системные параметры с помощью заданных данных тренировки ввода/вывода. Объект 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
   5 	 0.227036
Step size increases to 0.011000 after epoch 5.
   6 	 0.2265
   7 	 0.225968
   8 	 0.225488
   9 	 0.225052
Step size increases to 0.012100 after epoch 9.
  10 	 0.22465

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

Minimal training RMSE = 0.224650

Постройте выходные данные ANFIS и данные тренировки.

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

Данные 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.083385

Постройте выходные данные ANFIS и данные тренировки.

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

Соответствие между данными тренировки и ANFIS вывод улучшилось.

Создайте одно вход, данные тренировки одно вывода.

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

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

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')

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

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)

Загрузите данные тренировки.

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')

Минимальная ошибка валидации происходит в эпоху 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);

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

развернуть все

Не рекомендуемый запуск в R2018b

Ссылки

[1] Jang, J.-S. R. "Нечеткое Моделирование Используя Обобщенные Нейронные сети и Алгоритм Фильтра Калмана", Proc. Девятой Национальной Конференции по Искусственному интеллекту (AAAI-91). Июль 1991, стр 762-767.

[2] Jang, J.-S. R. "ANFIS: "Адаптивная Сеть основывала" Нечеткие Системы Вывода", Транзакции IEEE в Системах, Человеке, и Кибернетике, Издании 23, № 3, май 1993, стр 665-685.

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