В этом примере показано, как моделировать взаимосвязь между количеством автомобильных поездок, созданных в области, и демографическими данными области с использованием вычитаемой кластеризации и настройки ANFIS.
В этом примере используются демографические данные и данные о поездках из 100 зон анализа трафика в округе Нью-Касл, штат Делавэр. Набор данных содержит пять демографических факторов в качестве входных переменных: численность населения, количество единиц жилья, владение транспортными средствами, средний доход домохозяйства и общая занятость. Данные содержат одну выходную переменную, количество автомобильных поездок.
Загрузите данные обучения и проверки.
load trafficDataНабор данных содержит 100 точек данных, 75 для обучения и 25 для проверки. Входные данные обучения (datainи входные данные проверки (valdatain) каждый имеет пять столбцов, которые представляют входные переменные. Выходные данные обучения (dataoutи выходные данные проверки (valdataout) каждый имеет один столбец, который представляет выходную переменную.
Постройте график данных обучения.
subplot(2,1,1) plot(datain) legend("population","number of dwelling units","vehicle ownership",... "median household income","total employment","Location","northwest") title('Input Variables') xlabel('Data Point') subplot(2,1,2) plot(dataout) legend("number of trips") title("Output Variable") xlabel('Data Point')

Субтрактивная кластеризация является быстрым однопроходным алгоритмом для оценки количества кластеров и центров кластеров в наборе данных. Для кластеризации обучающих данных с использованием вычитаемой кластеризации используйте subclust функция.
[C,S] = subclust([datain dataout],0.5);
Для этого примера используйте диапазон влияния кластера 0.5. Это значение указывает диапазон влияния кластера при рассмотрении пространства данных как гиперкуба единицы измерения. Указание малого радиуса кластера обычно порождает множество небольших кластеров в данных, что приводит к созданию FIS со многими правилами. Задание большого радиуса кластера обычно приводит к появлению нескольких больших кластеров в данных и к меньшему количеству правил.
Каждая строка C содержит позицию кластерного центра, идентифицированную алгоритмом кластеризации. В этом случае алгоритм обнаружил три кластера в данных.
C
C = 3×6
1.8770 0.7630 0.9170 18.7500 1.5650 2.1830
0.3980 0.1510 0.1320 8.1590 0.6250 0.6480
3.1160 1.1930 1.4870 19.7330 0.6030 2.3850
Постройте график обучающих данных вместе с центрами кластеров для двух входных переменных.
figure plot(datain(:,5),dataout(:,1),'.',C(:,5),C(:,6),"r*") legend("Data points","Cluster centers","Location","southeast") xlabel("Total Employment") ylabel("Number of Trips") title("Data and Cluster Centers")

Значения в S показать диапазон влияния центров кластеров для каждого измерения данных. Все центры кластеров имеют одинаковый набор S значения.
S
S = 1×6
1.1621 0.4117 0.6555 7.6139 2.8931 1.4395
Используйте genfis для генерации системы нечеткого вывода (FIS) из данных с использованием вычитаемой кластеризации.
Важным преимуществом использования метода кластеризации для поиска правил является то, что результирующие правила более приспособлены к входным данным, чем в FIS, генерируемой без кластеризации. Эта настройка уменьшает общее количество правил, когда входные данные имеют высокую размерность.
Сначала создайте genfisOptions набор параметров для вычитаемой кластеризации, задающий одно и то же значение диапазона влияния кластера.
opt = genfisOptions("SubtractiveClustering","ClusterInfluenceRange",0.5);
Создание модели FIS с использованием данных обучения и заданных опций.
fis = genfis(datain,dataout,opt);
Исходя из размеров входных и выходных учебных данных, созданная FIS имеет пять входов и один выход. genfis присваивает имена по умолчанию для входов, выходов и функций членства.
Созданный объект FIS представляет собой систему Sugeno первого порядка с тремя правилами.
showrule(fis)
ans = 3x158 char array
'1. If (in1 is in1cluster1) and (in2 is in2cluster1) and (in3 is in3cluster1) and (in4 is in4cluster1) and (in5 is in5cluster1) then (out1 is out1cluster1) (1)'
'2. If (in1 is in1cluster2) and (in2 is in2cluster2) and (in3 is in3cluster2) and (in4 is in4cluster2) and (in5 is in5cluster2) then (out1 is out1cluster2) (1)'
'3. If (in1 is in1cluster3) and (in2 is in2cluster3) and (in3 is in3cluster3) and (in4 is in4cluster3) and (in5 is in5cluster3) then (out1 is out1cluster3) (1)'
Можно концептуализировать каждое правило следующим образом: если входы в FIS (население, жилые единицы, количество транспортных средств, доход и занятость) сильно относятся к их представительским функциям членства для кластера, то выход (количество поездок) должен принадлежать тому же кластеру. То есть каждое правило кратко сопоставляет кластер во входном пространстве тому же кластеру в выходном пространстве.
Каждая входная и выходная переменная имеет три функции членства, которые соответствуют трем идентифицированным кластерам. Параметры входных и выходных функций членства выводятся на основе центров кластеров и диапазонов влияния кластеров. В качестве примера постройте график функций членства для первой входной переменной.
figure
plotmf(fis,"input",1)
Примените входные значения обучения к нечеткой системе и найдите соответствующие выходные значения.
fuzout = evalfis(fis,datain);
Вычислите среднеквадратичную ошибку (RMSE) выходных значений нечеткой системы по сравнению с ожидаемыми выходными значениями.
trnRMSE = norm(fuzout-dataout)/sqrt(length(fuzout))
trnRMSE = 0.5276
Проверьте производительность нечеткой системы с помощью данных проверки.
valfuzout = evalfis(fis,valdatain); valRMSE = norm(valfuzout-valdataout)/sqrt(length(valfuzout))
valRMSE = 0.6179
Постройте график вывода модели по данным проверки.
figure plot(valdataout) hold on plot(valfuzout,"o") hold off ylabel('Output value') legend("Validation data","FIS output","Location","northwest")

График показывает, что модель плохо предсказывает данные проверки.
Для повышения производительности FIS можно оптимизировать систему с помощью anfis функция. Сначала попробуйте использовать относительно короткий период обучения (20 периодов) без использования данных проверки, а затем протестируйте полученную модель FIS на основе данных проверки.
anfisOpt = anfisOptions('InitialFIS',fis,... 'EpochNumber',20,... 'InitialStepSize',0.1); fis2 = anfis([datain dataout],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 Step size decreases to 0.090000 after epoch 7. 7 0.48733 8 0.485036 9 0.480813 Step size increases to 0.099000 after epoch 10. 10 0.475097 11 0.469759 12 0.462516 13 0.451177 Step size increases to 0.108900 after epoch 14. 14 0.447856 15 0.444357 16 0.433904 17 0.433739 Step size increases to 0.119790 after epoch 18. 18 0.420408 19 0.420512 20 0.420275 Designated epoch number reached. ANFIS training completed at epoch 20. Minimal training RMSE = 0.420275
Оценка эффективности FIS как по учебным данным, так и по данным проверки.
fuzout2 = evalfis(fis2,datain); trnRMSE2 = norm(fuzout2-dataout)/sqrt(length(fuzout2))
trnRMSE2 = 0.4203
valfuzout2 = evalfis(fis2,valdatain); valRMSE2 = norm(valfuzout2-valdataout)/sqrt(length(valfuzout2))
valRMSE2 = 0.5894
Эффективность модели показывает существенное улучшение в отношении данных обучения, но лишь незначительно в отношении данных проверки. Постройте график улучшенных выходных данных модели по данным проверки.
figure plot(valdataout) hold on plot(valfuzout,'o') plot(valfuzout2,'x') hold off ylabel('Output value') legend("Validation data","Initial FIS: RMSE = " + num2str(valRMSE), ... "Tuned FIS: RMSE = " + num2str(valRMSE2), ... "Location","northwest")

При настройке FIS можно обнаружить переопределение, когда ошибка проверки начинает увеличиваться, а ошибка обучения продолжает уменьшаться.
Для проверки модели на переоборудование используйте anfis с данными проверки для обучения модели для 200 эпох. Сначала настройте параметры обучения ANFIS путем изменения существующего anfisOptions набор опций. Укажите количество периодов и данные проверки. Поскольку количество периодов обучения больше, подавление отображения информации об обучении в окне команд.
anfisOpt.EpochNumber = 200; anfisOpt.ValidationData = [valdatain valdataout]; anfisOpt.DisplayANFISInformation = 0; anfisOpt.DisplayErrorValues = 0; anfisOpt.DisplayStepSize = 0; anfisOpt.DisplayFinalResults = 0;
Обучение FIS.
[fis3,trnErr,stepSize,fis4,valErr] = anfis([datain dataout],anfisOpt);
Здесь:
fis3 является объектом FIS, когда ошибка обучения достигает минимума.
fis4 является объектом FIS моментального снимка, когда ошибка данных проверки достигает минимума.
stepSize - это история размеров обучающих шагов.
trnErr - RMSE с использованием данных обучения.
valErr - это RMSE, использующий данные проверки для каждой эпохи обучения.
После завершения обучения проверьте модель с помощью данных обучения и проверки.
fuzout4 = evalfis(fis4,datain); trnRMSE4 = norm(fuzout4-dataout)/sqrt(length(fuzout4))
trnRMSE4 = 0.3393
valfuzout4 = evalfis(fis4,valdatain); valRMSE4 = norm(valfuzout4-valdataout)/sqrt(length(valfuzout4))
valRMSE4 = 0.5834
Ошибка с данными обучения является самой низкой на данный момент, и ошибка с данными проверки также немного ниже, чем ранее. Этот результат предполагает возможное переоборудование, которое происходит, когда нечеткая система подгоняется к учебным данным настолько хорошо, что это больше не делает хорошую работу по подгонке данных проверки. Результат - потеря общности.
Просмотр улучшенных выходных данных модели. Постройте график вывода модели по данным проверки.
figure plot(valdataout) hold on plot(valfuzout2,'o') plot(valfuzout4,'x') hold off ylabel('Output value') legend("Validation data","Tuned FIS: RMSE = " + num2str(valRMSE2), ... "Min val. error FIS: RMSE = " + num2str(valRMSE4), ... "Location","northwest")

Затем постройте график ошибки обучения trnErr.
figure plot(trnErr) title('Training Error') xlabel('Number of Epochs') ylabel('Error')

Этот сюжет показывает, что ошибка обучения улаживается примерно в 60-ю эпоху.
Постройте график ошибки проверки valErr.
figure plot(valErr) title('Validation Error') xlabel('Number of Epochs') ylabel('Error')

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