You are on page 1of 13

Предвиђање потрошње горива

Увод
Предвиђање MPG (miles per gallon) је типичан регресиони нелинеарни
проблем, у ком се неколико информација о аутомобилском профилу
користе да предвиде следећи непрекидан атрибут, потрошњу горива у MPG.
Подаци су створени на UCI (Univ. of California at Irvine).
Доле приказана табела има неколико примера из скупа података MPG. Шест
улазних атрибута су број цилиндара, промена места, коњска снага, тежина,
убрзање, и годиште аутомобила. Излазна променљива која се предвиђа је
потрошња горива у MPG. (Произвођачи аутомобила и модели у првој колони
табеле се не користе у предвиђању).
Прављење партиција
Скуп података се добија из оригиналног фајла са подацима 'auto-gas.dat'.
Затим се скуп података дели у скуп обучених података (примери непарних
индекса) и чекирани скуп (пример парних индекса).
[data, input_name] = loadgas;
trn_data = data(1:2:end, :);
chk_data = data(2:2:end, :);
Улазни избор
Функција exhsrch изводи детаљну претрагу унутар доступних улаза да би се
изабрао скуп улаза који највише утиче на потрошњу горива. Први параметар
у функцији одређује број улазних комбинација који се пробају током
претраге. Функција, exhsrch гради ANFIS модел за сваку комбинацију и врши
обуку за једну epoch и извештава о постигнутом извођењу. У следећем
примеру функција exhsrch се користи да одреди најутицајнији улазни атрибут
у предвиђању излаза.
exhsrch(1, trn_data, chk_data, input_name);
Обука 6 ANFIS модела, сваки са 1 улазом изабраним од 6 кандидата...

ANFIS model 1: Cylinder --> trn=4.6400, chk=4.7255


ANFIS model 2: Disp --> trn=4.3106, chk=4.4316
ANFIS model 3: Power --> trn=4.5399, chk=4.1713
ANFIS model 4: Weight --> trn=4.2577, chk=4.0863
ANFIS model 5: Acceler --> trn=6.9789, chk=6.9317
ANFIS model 6: Year --> trn=6.2255, chk=6.1693

Слика 1: Утицај сваке улазне променљиве на потрошњу горива


Улазна променљива која се налази скроз лево на Слици 1 има најмању
грешку.
График и резултати функције јасно приказују да улазни атрибут 'Тежина'
најутицајнији. Обука и приказане грешке се могу поредити, што показује да
нема преклапања.
Интуитивно може се једноставно изабрати 'Тежина' и 'Промена места'
директно пошто имају најмање грешке што се види из дијаграма. Како било
то не мора обавезно да буде оптимална комбинација два улаза која
резултује у минималној обученој грешци. За верификацију овога користи се
функција exhsrch за претрагу оптималне комбинације 2 улазна атрибута.
input_index = exhsrch(2, trn_data, chk_data, input_name);
Обука 15 ANFIS модела, сваки са 2 улаза изабрана од 6 кандидата...

ANFIS model 1: Cylinder Disp --> trn=3.9320, chk=4.7920


ANFIS model 2: Cylinder Power --> trn=3.7364, chk=4.8683
ANFIS model 3: Cylinder Weight --> trn=3.8741, chk=4.6763
ANFIS model 4: Cylinder Acceler --> trn=4.3287, chk=5.9625
ANFIS model 5: Cylinder Year --> trn=3.7129, chk=4.5946
ANFIS model 6: Disp Power --> trn=3.8087, chk=3.8594
ANFIS model 7: Disp Weight --> trn=4.0271, chk=4.6350
ANFIS model 8: Disp Acceler --> trn=4.0782, chk=4.4890
ANFIS model 9: Disp Year --> trn=2.9565, chk=3.3905
ANFIS model 10: Power Weight --> trn=3.9310, chk=4.2976
ANFIS model 11: Power Acceler --> trn=4.2740, chk=3.8738
ANFIS model 12: Power Year --> trn=3.3796, chk=3.3505
ANFIS model 13: Weight Acceler --> trn=4.0875, chk=4.0095
ANFIS model 14: Weight Year --> trn=2.7657, chk=2.9953
ANFIS model 15: Acceler Year --> trn=5.6242, chk=5.6481

Слика 2: Комбинација две улазне променљиве и њихов утицај на потрошњу


горива
Резултат из функције exhsrch показује да су 'Тежина' и 'Година' форма
оптималне комбинације два улазна атрибута.
Ако се користи више улаза тада је функција
exhsrch(3, trn_data, chk_data, input_name);
Обука 20 ANFIS модела, сваки са 3 улаза изабран од 6 кандидата...

ANFIS model 1: Cylinder Disp Power --> trn=3.4446, chk=11.5329


ANFIS model 2: Cylinder Disp Weight --> trn=3.6686, chk=4.8922
ANFIS model 3: Cylinder Disp Acceler --> trn=3.6610, chk=5.2384
ANFIS model 4: Cylinder Disp Year --> trn=2.5463, chk=4.9001
ANFIS model 5: Cylinder Power Weight --> trn=3.4797, chk=9.3761
ANFIS model 6: Cylinder Power Acceler --> trn=3.5432, chk=4.4804
ANFIS model 7: Cylinder Power Year --> trn=2.6300, chk=3.6300
ANFIS model 8: Cylinder Weight Acceler --> trn=3.5708, chk=4.8379
ANFIS model 9: Cylinder Weight Year --> trn=2.4951, chk=4.0435
ANFIS model 10: Cylinder Acceler Year --> trn=3.2698, chk=6.2616
ANFIS model 11: Disp Power Weight --> trn=3.5879, chk=7.4942
ANFIS model 12: Disp Power Acceler --> trn=3.5395, chk=3.9953
ANFIS model 13: Disp Power Year --> trn=2.4607, chk=3.3563
ANFIS model 14: Disp Weight Acceler --> trn=3.6075, chk=4.2318
ANFIS model 15: Disp Weight Year --> trn=2.5617, chk=3.7866
ANFIS model 16: Disp Acceler Year --> trn=2.4149, chk=3.2480
ANFIS model 17: Power Weight Acceler --> trn=3.7884, chk=4.0480
ANFIS model 18: Power Weight Year --> trn=2.4371, chk=3.2852
ANFIS model 19: Power Acceler Year --> trn=2.7276, chk=3.2580
ANFIS model 20: Weight Acceler Year --> trn=2.3603, chk=2.9152
Слика 3: Комбинација 3 улазне променљиве и њихов утицај на потрошњу
горива
Слика приказује резултате за изабране три улазне величине, при чему се
'Тежина', 'Годиште', и 'Убрзање' бирају као најбоља комбинација три улазне
променљиве. Како било минимална обука и провера грешака не смањује
значајно најбољи модел са 2 улаза, који показује да нови атрибут 'Убрзање'
не побољшава много претпоставку. Најбоље је увек користити једноставну
структуру. За даље истраживање је најбоље узети модел са два улаза.
Затим се издвајају изабрани улазни атрибути из оригиналног обученог и
означеног скупа података.
close all;
new_trn_data = trn_data(:, [input_index, size(trn_data,2)]);
new_chk_data = chk_data(:, [input_index, size(chk_data,2)]);
Обука ANFIS Модела
Функција exhsrch обучава сваки ANFIS модел за појединачни epoch да би се
брзо пронашли праве улазне величине. Сада када су поправљени улази,
може се више времена потрошити на ANFIS обуку (100 epochs).
Функција genfis1 ствара иницијални FIS од обучених података, који се затим
фино подешавају од стране ANFIS да би се креирао финални модел.
in_fismat = genfis1(new_trn_data, 2, 'gbellmf');
[trn_out_fismat, trn_error, step_size, chk_out_fismat, chk_error] = ...
anfis(new_trn_data, in_fismat, [100 nan 0.01 0.5 1.5], [0,0,0,0], new_chk_data,
1);
ANFIS приказује грешку у складу са обученим и означеним подацима у листи
излазних параметара. График који приказује грешке обезбеђује корисне
информације о процесу обуке.
[a, b] = min(chk_error);
plot(1:100, trn_error, 'g-', 1:100, chk_error, 'r-', b, a, 'ko');
title('Training (green) and checking (red) error curve','fontsize',10);
xlabel('Epoch numbers','fontsize',10);
ylabel('RMS errors','fontsize',10);

Слика 4: ANFIS обучене и означене грешке


Горњи график приказује криве грешака за 100 epochs ANFIS обуку. Зелена
крива даје грешке обуке а црвена крива даје означене грешке. Минималне
означене грешке се дешавају отприлике на epoch 45, што је приказано
кругом. Треба приметити да означене криве се повећавају послее 50 epochs,
показујучи да даља обука даје лошије резултате.
ANFIS vs Линеарна Регресија
У овој фази би требало проверити извођење ANFIS модела са линеарним
регресионим моделом.
% Izvodjenje linearne regresije
N = size(trn_data,1);
A = [trn_data(:,1:6) ones(N,1)];
B = trn_data(:,7);
coef = A\B; % Resavanje regresionih parametara za obucene podatke

Nc = size(chk_data,1);
A_ck = [chk_data(:,1:6) ones(Nc,1)];
B_ck = chk_data(:,7);
lr_rmse = norm(A_ck*coef-B_ck)/sqrt(Nc);
% Printing results
fprintf('\nRMSE against checking data\nANFIS : %1.3f\tLinear Regression :
%1.3f\n', a, lr_rmse);
RMSE against checking data
ANFIS : 2.980 Linear Regression : 3.444
Види се да ANFIS модел заостаје у извођењу за линеарним регресионим
моделом.
Анализа ANFIS Модела
Променљива chk_out_fismat представља снимак ANFIS модела при
минималној грешци за време процеса обуке. Улазно излазна површина
модела је приказана на доњој слици.
chk_out_fismat = setfis(chk_out_fismat, 'input', 1, 'name', 'Weight');
chk_out_fismat = setfis(chk_out_fismat, 'input', 2, 'name', 'Year');
chk_out_fismat = setfis(chk_out_fismat, 'output', 1, 'name', 'MPG');

% Stvaranje FIS izlazne povrsine


gensurf(chk_out_fismat);
Слика 5: Улазно-Излазна површина за обучену FIS
Улазно излазна површина горе приказана је нелинеарна и монотона
површина и приказује како ће ANFIS модел реаговати на разноврсне
вредности улазних променљивих као што су 'тежина' и 'годиште'.
Ограничења и последице
Могу се видети и неки лажни подаци у левом углу површине. Из те анализе
се види да што је тежи аутомобил тада ће он бити ефикаснији у погледу
потрошње горива што је цупротно реалности, због недостатка података.
plot(new_trn_data(:,1), new_trn_data(:, 2), 'bo', ...
new_chk_data(:,1), new_chk_data(:, 2), 'rx');
xlabel('Weight','fontsize',10);
ylabel('Year','fontsize',10);
title('Training (o) and checking (x) data','fontsize',10);
Слика 6: График Тежина према Годишту приказује недостатак података у
горњем десном углу.
Овај график приказује дистрибуцију података. Недостатак обучених података
у горњем десном углу може да доведе до озбиљних грешака које су раније
споменуте.
[data, input_name] = loadgas;
trn_data = data(1:2:end, :);
chk_data = data(2:2:end, :);

%% Izbor ulaznih velicina

exhsrch(1, trn_data, chk_data, input_name);

%%
% *Slika 1:* Uticaj svake ulazne velicine na potrosnju goriva

input_index = exhsrch(2, trn_data, chk_data, input_name);

%%
% *Slika 2:* Kombinacija dve ulazne promenljive i njihov
% uticaj
% na potrosnju goriva

exhsrch(3, trn_data, chk_data, input_name);

%%
% *Slika 3:* Kombinacija tri ulazne promenljive i njihov
% uticaj
% na potrosnju goriva

close all;
new_trn_data = trn_data(:, [input_index, size(trn_data,2)]);
new_chk_data = chk_data(:, [input_index, size(chk_data,2)]);

%% Obuka ANFIS modela

in_fismat = genfis1(new_trn_data, 2, 'gbellmf');


[trn_out_fismat, trn_error, step_size, chk_out_fismat,
chk_error] = ...
anfis(new_trn_data, in_fismat, [100 nan 0.01 0.5 1.5],
[0,0,0,0], new_chk_data, 1);

%%
% ANFIS prikazuje greske u skladu sa obucenim i oznacenim
% podacima
% u listi izlaznih parametara. Grafik gresaka obezbedjuje
% korisne informacije o obucenim podacima.

[a, b] = min(chk_error);
plot(1:100, trn_error, 'g-', 1:100, chk_error, 'r-', b, a, 'ko');
title('Training (green) and checking (red) error
curve','fontsize',10);
xlabel('Epoch numbers','fontsize',10);
ylabel('RMS errors','fontsize',10);

%%
% *Slika 4:* ANFIS obucavanje i oznacene greske

% Izvodjenje Linearne Regresije


N = size(trn_data,1);
A = [trn_data(:,1:6) ones(N,1)];
B = trn_data(:,7);
coef = A\B; % Resavanje regresionih parametara

Nc = size(chk_data,1);
A_ck = [chk_data(:,1:6) ones(Nc,1)];
B_ck = chk_data(:,7);
lr_rmse = norm(A_ck*coef-B_ck)/sqrt(Nc);
% Stampanje rezultata
fprintf('\nRMSE against checking data\nANFIS : %1.3f\tLinear
Regression : %1.3f\n', a, lr_rmse);

%% Analiziranje ANFIS Modela


% promenljiva |chk_out_fismat| predstavlja snimak
% ANFIS modela
% pri minimalnoj oznacenoj gresci za vreme procesa obuke
% Ulazno izlazna povrsina je prikazana na grafiku dole.

chk_out_fismat = setfis(chk_out_fismat, 'input', 1, 'name',


'Weight');
chk_out_fismat = setfis(chk_out_fismat, 'input', 2, 'name',
'Year');
chk_out_fismat = setfis(chk_out_fismat, 'output', 1, 'name',
'MPG');

% Stvaranje FIS izlazne povrsine


gensurf(chk_out_fismat);

%%
% *Slika 5:* Ulazno izlazna povrsina za obuceni FIS

%% Ogranicenja i Uzroci

plot(new_trn_data(:,1), new_trn_data(:, 2), 'bo', ...


new_chk_data(:,1), new_chk_data(:, 2), 'rx');
xlabel('Weight','fontsize',10);
ylabel('Year','fontsize',10);
title('Training (o) and checking (x) data','fontsize',10);

You might also like