Образцовый житель пригорода, коммутирующийся Используя отнимающую кластеризацию

Этот пример показывает, как смоделировать отношение между количеством автомобильных прохождений, сгенерированных от области и демографией области с помощью функции genfis. Демографический и данные о прохождении от 100 аналитических зон трафика в графстве Ньюкасл, Делавэр. Пять демографических факторов рассматриваются: генеральная совокупность, количество жилых секций, владения автомобиля, среднего дохода семьи и общей занятости. Следовательно, модель имеет пять входных переменных и одну выходную переменную.

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

mytripdata
subplot(2,1,1)
plot(datin)
ylabel('input')
subplot(2,1,2)
plot(datout)
ylabel('output')

Команда mytripdata создает несколько переменных в рабочей области. Из исходных 100 точек данных используйте 75 точек данных в качестве данных тренировки (datin и datout) и 25 точек данных как проверка данных (а также для тестовых данных, чтобы подтвердить модель). Вводом данных проверки / выходные переменные пары является chkdatin и chkdatout.

Сгенерируйте модель от данных с помощью отнимающей кластеризации с помощью команды genfis.

Во-первых, создайте набор опции genfisOptions для отнимающей кластеризации, задав свойство области значений ClusterInfluenceRange. Свойство ClusterInfluenceRange указывает на область значений влияния кластера, когда вы рассматриваете пространство данных как единичный гиперкуб. Определение маленького кластерного радиуса обычно приводит ко многим небольшим кластерам в данных и приводит ко многим правилам. Определение большого кластерного радиуса обычно приводит к нескольким большим кластерам в данных и приводит к меньшему количеству правил.

opt = genfisOptions('SubtractiveClustering','ClusterInfluenceRange',0.5);

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

fismat = genfis(datin,datout,opt);

Команда genfis использует метод с одной передачей, который не выполняет итеративной оптимизации. Тип модели для сгенерированного объекта FIS является моделью Sugeno первого порядка с тремя правилами.

Проверьте модель. Здесь, trnRMSE является среднеквадратической ошибкой системы, сгенерированной данными тренировки.

fuzout = evalfis(fismat,datin);
trnRMSE = norm(fuzout-datout)/sqrt(length(fuzout))
trnRMSE = 0.5276

Затем, примените тестовые данные к FIS, чтобы подтвердить модель. В этом примере данные о валидации используются и для проверки и для тестирования параметров FIS. Здесь, chkRMSE является среднеквадратической ошибкой системы, сгенерированной данными о валидации.

chkfuzout = evalfis(fismat,chkdatin);
chkRMSE = norm(chkfuzout-chkdatout)/sqrt(length(chkfuzout))
chkRMSE = 0.6179

Постройте вывод модели, chkfuzout, против данных о валидации, chkdatout.

figure
plot(chkdatout)
hold on
plot(chkfuzout,'o')
hold off

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

На данном этапе можно использовать возможность оптимизации anfis улучшить модель. Во-первых, попытайтесь использовать относительно короткий период подготовки (20 эпох), не используя данные о валидации, и затем протестируйте получившуюся модель FIS против данных о тестировании.

anfisOpt = anfisOptions('InitialFIS',fismat,'EpochNumber',20,...
                        'InitialStepSize',0.1);
fismat2 = anfis([datin datout],anfisOpt);
ANFIS info: 
	Number of nodes: 44
	Number of linear parameters: 18
	Number of nonlinear parameters: 30
	Total number of parameters: 48
	Number of training data pairs: 75
	Number of checking data pairs: 0
	Number of fuzzy rules: 3


Start training ANFIS ...

   1 	 0.527607
   2 	 0.513727
   3 	 0.492996
   4 	 0.499985
   5 	 0.490585
   6 	 0.492924
   7 	 0.48733
Step size decreases to 0.090000 after epoch 7.
   8 	 0.485036
   9 	 0.480813
  10 	 0.475097
Step size increases to 0.099000 after epoch 10.
  11 	 0.469759
  12 	 0.462516
  13 	 0.451177
  14 	 0.447856
Step size increases to 0.108900 after epoch 14.
  15 	 0.444356
  16 	 0.433904
  17 	 0.433739
  18 	 0.420408
Step size increases to 0.119790 after epoch 18.
  19 	 0.420512
  20 	 0.420275

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

Minimal training RMSE = 0.420275

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

fuzout2 = evalfis(fismat2,datin);
trnRMSE2 = norm(fuzout2-datout)/sqrt(length(fuzout2))
trnRMSE2 = 0.4203
chkfuzout2 = evalfis(fismat2,chkdatin);
chkRMSE2 = norm(chkfuzout2-chkdatout)/sqrt(length(chkfuzout2))
chkRMSE2 = 0.5894

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

figure
plot(chkdatout)
hold on
plot(chkfuzout2,'o')
hold off

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

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

Чтобы проверять модель на сверхподбор кривой, используйте anfis с данными о валидации, чтобы обучить модель в течение 200 эпох.

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

anfisOpt.EpochNumber = 200;
anfisOpt.ValidationData = [chkdatin chkdatout];
anfisOpt.DisplayANFISInformation = 0;
anfisOpt.DisplayErrorValues = 0;
anfisOpt.DisplayStepSize = 0;
anfisOpt.DisplayFinalResults = 0;

Обучите FIS.

[fismat3,trnErr,stepSize,fismat4,chkErr] = anfis([datin datout],anfisOpt);

Здесь,

  • fismat3 является объектом FIS, когда учебная ошибка достигает минимума.

  • fismat4 является объектом FIS снимка состояния, когда ошибка данных о валидации достигает минимума.

  • stepSize является историей учебных размеров шага.

  • trnErr является RMSE использование данных тренировки

  • chkErr является RMSE использование данных о валидации в течение каждой учебной эпохи.

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

fuzout4 = evalfis(fismat4,datin);
trnRMSE4 = norm(fuzout4-datout)/sqrt(length(fuzout4))
trnRMSE4 = 0.3393
chkfuzout4 = evalfis(fismat4,chkdatin);
chkRMSE4 = norm(chkfuzout4-chkdatout)/sqrt(length(chkfuzout4))
chkRMSE4 = 0.5834

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

Просмотрите улучшенный образцовый вывод. Постройте образцовый вывод против данных о проверке.

figure
plot(chkdatout)
hold on
plot(chkfuzout4,'o')
hold off

Образцовые данные вывода и валидации показываются кругами и чисто синей строкой, соответственно.

Затем, постройте учебную ошибку, trnErr.

figure
plot(trnErr)
title('Training Error')
xlabel('Number of Epochs')
ylabel('Training Error')

Этот график показывает, что учебная ошибка обосновывается приблизительно в 60-й точке эпохи.

Постройте ошибку проверки, chkErr.

figure
plot(chkErr)
title('Checking Error')
xlabel('Number of Epochs')
ylabel('Checking Error')

График показывает, что наименьшее значение ошибки данных о валидации происходит в 52-ю эпоху. После этой точки это увеличивается немного, как раз когда anfis продолжает минимизировать ошибку против данных тренировки полностью к 200-й эпохе. В зависимости от заданного ошибочного допуска график также показывает способность модели обобщить тестовые данные.

Можно также сравнить вывод fismat2 и fistmat4 против данных о валидации, chkdatout.

figure
plot(chkdatout)
hold on
plot(chkfuzout4,'ob')
plot(chkfuzout2,'+r')

Смотрите также

|

Похожие темы