Этот пример показывает, как смоделировать отношение между количеством автомобильных прохождений, сгенерированных от области и демографией области с помощью функции 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')