Kita mengenal peramalan berdasarkan time series data dengan menggunakan regresi saat di bangku sekolah dahulu. Ternyata peramalan bisa juga dengan menggunakan Jaringan Syaraf Tiruan (JST). Peramalan dengan JST memiliki keunggulan karena kemampuan JST yang sangat baik dalam menangani data non-linear. Ditambah lagi, JST mampu disisipkan dengan data pendamping selain data time series yang dikenal dengan istilah intervening indicator atau exogenous input. Jika pada postingan sebelumnya menggunakan referensi dari situs ini, maka kali ini kita coba dengan menggunakan fungsi bawaan Matlab yang dikenal dengan istilah Time Series NARX Feedback Neural Network. NARX itu sendiri singkatan dari Nonlinear Autoregressive Network wit eXogenous input. Kita akan mencoba meramalkan data penurunan jumlah taman seperti tabel di bawah ini (mengisi kolom yang ditunjukan dengan tanda tanya).
Data exogenous adalah populasi yang merupakan hasil dari proyeksi yang menunjukan trend bertambah, sementara park menunjukan trend menurun. Apakah JST sanggup memprediksi berapa penurunan jumlah taman sebagai akibat dari kenaikan populasi? Buka command window Matlab.
Masukkan data populasi X. Cara mudahnya tinggal anda copy-paste dari excel:
-
X=[1845005 1873470 1882869 2334142 2733030]
-
X=con2seq(X)
Di sini fungsi con2seq bermaksud mengkonversi data continyu menjadi sequensial yang jika dilihat di workspace window berupa tipe data “cell”. Sementara itu untuk data populasi untuk meramalkan adalah lima yang terakhir:
-
X2=[2334142 2733030 2943860 3155340 3369800]
-
X2=con2seq(X2)
Perhatikan untuk X2 sebagai prediksi di sini ada “shift” (untuk prediksi berikutnya ada data yang terkesan diulangi, lihat yang berwarna merah) dengan X sebelumnya. Lihat kembali prinsip-prinsip dasar windowing pada tulisan terdahulu. Untuk data park yang akan diramalkan, gunakan variabel T
-
T=[1904 1904 1887 1858 1772]
-
T=con2seq(T)
Intruksi berikut ini adalah untuk merakit NARX close dan open loupe, dilanjutkan dengan prediksi lima terakhir.
-
net = narxnet(1:2,1:2,10); %membuat NARX dgn riwayat 2 data sebelumnya (1:2)
-
[x,xi,ai,t] = preparets(net,X,{},T); %menyiapkan data training dan target “preparets=prepare time series”
-
net = train(net,x,t,xi,ai); %training NARX dengan data dari preparets
-
y = net(x,xi,ai); %memunculkan data hasil training untuk patokan validasi
-
netc = closeloop(net); %membuat NARX menjadi lingkar tertutup (serial-paralel)
-
view(netc); %melihat network lingkar tertutup NARX
-
[x,xi,ai,t] = preparets(netc,X,{},T); %persiapan data untuk memprediksi data 3,4,dan 5
-
yc = netc(x,xi,ai); %simulasi data 3,4,5 (cek errornya .. bandingkan dengan T)
Perintah view bermaksud melihat struktur NARX yang baru saja dirakit seperti gambar di bawah ini:
Gunakan fungsi “preparets” untuk populasi lima tahun terakhir sehingga dihasilkan network (netc) untuk memprediksi park berdasarkan data exogenous populasi.
-
[x2,xi,ai,t] = preparets(netc,X2,{},T); %persiapan simulasi data yang akan datang
-
yc2 = netc(x2,xi,ai) %simulasikan data yang akan datang 6,7,8,9,10
Untuk membuat plot prediksinya, konversi kembali data sequensial menjadi desimal dengan fungsi “cell2mat” seperti berikut ini:
-
plot([cell2mat(T) cell2mat(yc2)])
Apakah hasil itu sudah fix? Ternyata belum. Coba saja running ulang, akan menghasilkan prediksi tiga tahun kedepan yang berbeda. Berikut ini running kedua saya:
Sepertinya cara ini kurang baik, bisa gunakan cara yang mudah dengan GUI di postingan tentang NARNET dan NARX
Semoga bisa menjadi inspirasi.
selamat siang pak, maaf mau tanya apakah ada contoh source code peramalan data time series dengan menggunakan jaringan syaraf tiruan dengan inisialisasi bobot nguyen widrow? terimakasih
kalo di matlab fungsi yang dipakai “initnw”. ketik aja “edit initnw” di command window, cari fungsi loop for untuk tiap masukan input. maksudnya supaya bobot awal menyebar ke seluruh range input.
>> initnw
Error using initnw (line 37)
Not enough input arguments.
muncul seperti ini pak. maaf sebelumnya saya belum bisa pemrograman.
Apakah ada contoh sederhananya untuk diterapkan di GUI matlab, pak? terimakasih
Saya coba bikin source code seperti ini pak :
% — Executes on button press in Learning.
function Learning_Callback(hObject, eventdata, handles)
% hObject handle to Learning (see GCBO)
% eventdata reserved – to be defined in a future version of MATLAB
% handles structure with handles and user data (see GUIDATA)
%input parameter
a1=str2num(get(handles.epoch,’string’));
a2=str2num(get(handles.alfa,’string’));
a3=str2num(get(handles.galat,’string’));
a4=str2num(get(handles.hidden,’string’));
%proses membaca data latih dari excel
filename = ‘tabel.xlsx’;
sheet = 2;
xlRange = ‘B3:N74′;
Data = xlsread(filename, sheet, xlRange);
P = Data(:,1:12)’;
T = Data(:,13)’;
[m,n] = size(P);
% Pembuatan JST
net = newff(minmax(P),[a4 1],{‘tansig’ ‘logsig’ ‘purelin’},’trainlm’);
% Memberikan nilai untuk mempengaruhi proses pelatihan
net=init(net);
net.performFcn = ‘mse’;
net.trainParam.epochs = a1;
net.trainParam.lr = a2;
net.trainParam.goal = a3;
net.trainParam.show = 50;
net.trainParam.mc = 0.95;
% Proses training
[net,tr,Y,E] = train(net,P,T);
% Hasil setelah pelatihan
bobot_input = net.IW{1,1};
bobot_layer = net.LW{2,1};
bias_input = net.b{1,1};
bias_layer = net.b{2,1};
jumlah_iterasi = tr.num_epochs;
nilai_keluaran = Y;
nilai_error = E;
error_MSE = (1/n)*sum(nilai_error.^2);
save net net
% Hasil prediksi
hasil_latih = sim(net,P);
max_data = 272.975;
min_data = -68.4375;
hasil_latih = ((hasil_latih-0.1)*(max_data-min_data)/0.8)+min_data;
% Performansi hasil prediksi
filename = ‘tabel.xlsx’;
sheet = 1;
xlRange = ‘A107:BT107′;
T_asli = xlsread(filename, sheet, xlRange);
figure,
plotregression(T_asli,hasil_latih,’Regression’)
figure,
plotperform(tr)
figure,
plot(hasil_latih,’bo-‘)
hold on
plot(T_asli,’ro-‘)
hold off
grid on
title(strcat([‘Grafik Keluaran JST vs Target dengan nilai MSE = ‘,…
num2str(error_MSE)]))
xlabel(‘Pola ke-‘)
ylabel(‘Tingkat Pencemaran Udara’)
legend(‘Keluaran JST’,’Target’,’Location’,’Best’)
cr=(1/n)*sum(nilai_error.^2);
dr =(hasil_latih-nilai_keluaran)
set(handles.edit8,’string’,[num2str(cr)])
set(handles.edit9,’string’,[num2str(dr),’ %’])
set(handles.uitable3,’Data’,hasil_latih)
untuk source code diatas kan masih dalam bentuk prediksi JST backpropagation biasa. kemudian kalau saya ingin menggunakan JST tersebut dengan inisialisasi algoritma nguyen widrow, penambahan source code yang diperlukan apa saja pak dan dibagian mana? terimakasih
% Pembuatan JST
net = newff(minmax(P),[a4 1],{‘tansig’ ‘logsig’ ‘purelin’},’trainlm’);
% Memberikan nilai untuk mempengaruhi proses pelatihan
net=init(net);
net.performFcn = ‘mse’;
net.trainParam.epochs = a1;
net.trainParam.lr = a2;
net.trainParam.goal = a3;
net.trainParam.show = 50;
net.trainParam.mc = 0.95;
—–
Coba ganti init dengan initnw(net,1) untuk layer 1, 2, dst. cuma kan a4 harus sesuai dengan isian GUI, berarti harus dikode for i=1:a4, coba aja.
baik pak terimakasih 🙂
pak misalnya mau nyari pnikangkatannya gmna ?
misal data yg ingin diramal itu data beban (random kadang naik kadang turun) dan ex inputnya itu jumlah tahun (misal 2018, 2019 dst).
itu bsa ndak nyari peningkatan hasilnya ?
terimaksih
rata-rata aja. ada di materi curve fitting and interpolation kalo di regresi matlab.
Terimakasih untuk informasii ttg JST di atas mas, menambah pengetahuan baru lg buat sy. sy sedang penelitian JST, dan Mohon bantuannya ya pak. Kl code programnya yg bagian inisialisasi Nguyen Widrow dibawah sudah benar atau belum ya pak? kl belum perlu diperbaikin nya gmna?
clc;
clear;
data_5;
P = P’;
T
%input dan target
%diibentuk net dengan 2 lapisan
net = newff(minmax(P), [7 1], {‘tansig’ ‘purelin’}, ‘trainlm’);
%inisialisasi Nguyen Widrow
net = initnw(net,1);
net.initFcn = ‘initlay’;
net.layers{1}.initFcn = ‘initnw’;
%bobot-bobot awal
BobotAwalInput = net.IW{1,1};
BobotAwalBiasInput = net.b{1,1};
BobotAwalLapisan = net.LW{2,1};
BobotAwalBiasLapisan = net.b{2,1};
%set fungsi pelatihan jaringan
net.trainParam.epochs = 1000;
net.trainParam.goal = 1e-3;
net.trainParam.lr = Learning_rate;
net.trainParam.mc = 0.3;
net.trainParam.min_grad = 1e-10;
net.trainParam.show = 500;
%fungsi pelatihan
net = train(net, P, T);
coba saja, nanti kalau ada error pesannya apa, jumlah neuron sepertinya sedikit ya
Saat di run tidak ada error, bagaimana ya pak utk mengetahui bobot awalnya itu sudah pakai Nguyen atau belum?
iya jumlah neuron yg sy gunakan hanya sedikit.
Nguyen Widrow memang efektif utk set bobot yang tepat agar pelatihan BP optimal. Cek aja di fungsi tsb ada ‘initnw’-nya, lihat: https://www.mathworks.com/help/deeplearning/ref/initnw.html;jsessionid=25a448f55b8495e3e146b31887ba
sudah sy baca link tsb, disitu tertulis (net,i), jika i = 1 (satu) sudah benar belum ya kan itu merujuk ke bobot awal?