exponenta event banner

Модель пригородного сообщения с использованием субтрактивной кластеризации и ANFIS

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

Figure contains 2 axes. Axes 1 with title Input Variables contains 5 objects of type line. These objects represent population, number of dwelling units, vehicle ownership, median household income, total employment. Axes 2 with title Output Variable contains an object of type line. This object represents number of trips.

Кластерные данные

Субтрактивная кластеризация является быстрым однопроходным алгоритмом для оценки количества кластеров и центров кластеров в наборе данных. Для кластеризации обучающих данных с использованием вычитаемой кластеризации используйте 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")

Figure contains an axes. The axes with title Data and Cluster Centers contains 2 objects of type line. These objects represent Data points, 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)

Figure contains an axes. The axes contains 6 objects of type line, text.

Оценка первоначальной эффективности FIS

Примените входные значения обучения к нечеткой системе и найдите соответствующие выходные значения.

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

Figure contains an axes. The axes contains 2 objects of type line. These objects represent Validation data, FIS output.

График показывает, что модель плохо предсказывает данные проверки.

Настройка FIS с использованием ANFIS

Для повышения производительности 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")

Figure contains an axes. The axes contains 3 objects of type line. These objects represent Validation data, Initial FIS: RMSE = 0.61788, Tuned FIS: RMSE = 0.58941.

Проверка результата ANFIS на предмет переоборудования

При настройке 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")

Figure contains an axes. The axes contains 3 objects of type line. These objects represent Validation data, Tuned FIS: RMSE = 0.58941, Min val. error FIS: RMSE = 0.58337.

Затем постройте график ошибки обучения trnErr.

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

Figure contains an axes. The axes with title Training Error contains an object of type line.

Этот сюжет показывает, что ошибка обучения улаживается примерно в 60-ю эпоху.

Постройте график ошибки проверки valErr.

figure
plot(valErr)
title('Validation Error')
xlabel('Number of Epochs')
ylabel('Error')

Figure contains an axes. The axes with title Validation Error contains an object of type line.

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

См. также

|

Связанные темы