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