Peramalan dengan Jaringan Syaraf Tiruan – Matlab

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.

Iklan

8 thoughts on “Peramalan dengan Jaringan Syaraf Tiruan – Matlab

  1. 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

  2. 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.

Tinggalkan Balasan

Isikan data di bawah atau klik salah satu ikon untuk log in:

Logo WordPress.com

You are commenting using your WordPress.com account. Logout / Ubah )

Gambar Twitter

You are commenting using your Twitter account. Logout / Ubah )

Foto Facebook

You are commenting using your Facebook account. Logout / Ubah )

Foto Google+

You are commenting using your Google+ account. Logout / Ubah )

Connecting to %s