Melihat Data Network Hasil Training JST – Versi GUI

Pada postingan yang lalu telah dibahas cara mengetahui hasil training Jaringan Syaraf Tiruan (JST) dengan command window. Begitu juga bagaimana mengupdate salah satu parameternya, misalnya bias dan bias, sudah dibahas. Tetapi beberapa pembaca sepertinya agak kesulitan dengan instruksi-instruksi lewat command window. Oleh karena itu di sini akan dibahas cara yang jauh lebih mudah yaitu dengan “nntool”, salah satu GUI bawaan Matlab untuk merakit JST.

Sebenarnya masalah ini muncul ketika saya mencari kembali hasil training JST untuk peramalan (lihat post peramalan dengan JST di sini). Masalah yang sering dijumpai adalah “lupa”, karena banyaknya yang harus dikerjakan terkadang membuat seseorang lupa. Untungnya saya aktif menulis, tinggal masukan kata kunci di kolom “search” blog, catatan terdahulu yang dicari langsung ketemu. Jadi blog itu seperti catatan yang disimpan di “awan (cloud)” yang bisa diakses di mana saja dan kapan saja. Buka Matlab dan ketik nntool di command window.

Sebelumnya load terlebih dahulu Mat-file hasil training yang berisi variabel-variabel network. Di sini saya ada 7 variabel network yang saya sendiri lupa konfigurasinya. Setelah menekan “Import” di nntool maka muncul pilihan variabel yang akan dilihat. Ambil salah satu variabel hasil loading yang ada di workspace Matlab, dilanjutkan dengan kembali menekan Import setelah memilihnya.

Tekan Ok ketika ada informasi bahwa netwok telah berhasil diimpor. Tutup lagi sementara jendela Import to network/Data Manger. Perhatikan nntool kini telah muncul Network1 hasil impor. Untuk melihat isi dari variabel itu dobel klik saja di variabel tersebut.

Sebenarnya gambar di atas sudah cukup untuk mengetahui struktur JST yang telah dilatih dahulu. Misalnya input yang berjumlah 4 variabel dengan 1 keluaran. Hidden layer yang terletak di tengah tampak berjumlah sembilan. Gambar di atas khusus untuk Matlab versi 2013 ke atas, sementara Matlab versi yang terdahulu tidak memunculkan informasi tentang neuron-neuronnya. Silahkan tekan View/Edit Weights jika ingin melihat konfigurasi bobot-bobotnya. Kebetulan saya memiliki 4 variabel data yang akan dicoba prediksi dengan JST tersebut. Atau jika tidak ada, buat saja sendiri di command window. Tambahkan data input di nntool.

Tekan tombol Simulate pada network untuk memprediksi. Cara ini bisa juga dengan command window lewat instruksi sim.

Ada pesan untuk melihat nntool karena hasilnya dikirim ke sana. Jika sudah kembali ke nntool, tekan dua kali Output. Tampak hasilnya.

Sepertinya dengan nntool tidak banyak mengetik, alias tinggal klak-klik mouse saja. Jadi dengan empat masukan pada data akan menghasilkan satu keluaran (0.48). Di sini sebaiknya kita menggunakan normalisasi data, kalau bisa normal Euclidean, karena matrix yang dibuat dengan normal euclidean ortogonal yang disukai JST.

Iklan

Cluster Data dari ArcGIS ke Matlab

Postingan kali ini bermaksud mencoba membuat video tutorial bagaimana mengkluster data dari arcgis dengan software matlab. Iseng-iseng dengan pengisi suara dari translate google, ternyata oke juga. Hasilnya pun lumayan jelas dibanding saya yang ngomong .. haha.

Ada dua kandidat software perekam yang digunakan yaitu ‘screen-o-matic’ dan ‘microsoft expression’ yang keduanya gratis untuk menggunakannya. Hanya saja microsoft expression kali ini unggul karena bisa merekam suara dari ‘translate google’ dan saya belum berhasil dengan ‘screen-o-matic’ yang unggul jika ingin ada cam-nya. Silahkan lihat videonya.

Ups .. ternyata terpotong karena lebih 10 menit. Hasilnya adalah berikut ini.

Grafik Curve Fitting pada Matlab

Banyak tools untuk membuat grafik, salah satunya adalah Microsoft Excel. Berikut ini contoh bagaimana suatu data dikonversi menjadi grafik berbentuk interpolasi. Cara mucah, setelah men-sort data isian, pilih insert dan pilih grafik yang sesuai, dalam hal ini scatter dengan line.

Grafik itu menurut saya sudah baik, akan tetapi untuk dipublikasi dalam suatu jurnal ada baiknya membuat dengan format lain, salah satunya adalah Matlab. Fungsi yang digunakan adalah fungsi fit dilanjutkan dengan plot (lihat subplot untuk membuat lebih dari satu grafik pada postingan yang lalu). Buka matlab dan pindahkan tahun dan nilai ke workspace. Metode interpolasi yang cocok seperti di excel ternyata ‘pchipinterp’.

  • >> tahun=[2000;2010;2015;2017];
  • >> nilai=[2;5;9;4];
  • >> curvefit=fit(tahun,nilai,’pchipinterp’)
  • curvefit =
  • Shape-preserving (pchip) interpolant:
  • curvefit(x) = piecewise polynomial computed from p
  • Coefficients:
  • p = coefficient structure

Pastikan curvefit (bisa dengan nama lain) berhasil dibentuk. Lanjutkan dengan plotting dengan fungsi plot (lihat help untuk lebih jelasnya bagaimana menggunakan fungsi ini):

  • >> plot(tahun,nilai,’*’);
  • >> hold
  • Current plot held
  • >> plot(curvefit)

Hasilnya dapat dilihat pada gambar berikut.

Oiya, jangan printscreen gambar di atas untuk jurnal, lebih baik gunakan versi printing supaya hasilnya standar seperti di bawah ini (tekan simbol printer di menu). Semoga bermanfaat.

 

Membersihkan Layar dan Variabel Pada Command Window Matlab

Command window pada Matlab adalah jendela utama. Jendela ini sudah ada sejak kemunculan Matlab pertama kali di tahun 80-an.

(Dari berbagai sumber)

Ketika sampai bawah dan tulisan yang di atasnya mengganggu, untuk kenyamanan dapat dibersihkan dengan instruksi tertentu. Dua instruksi yang penting tapi terkadang belum diketahui oleh pengguna awal Matlab antara lain adalah clc dan clear.

1. CLC

Perintah/instruksi ini untuk membersihkan layar, mirip dengan cls pada comman prompt window (cmd). Variabel yang ada di workspace tidak ikut ‘bersih’ dengan instruksi ini.

2. CLEAR

Perintah/instruksi ini bermaksud membersihkan variabel yang ada diworkspace. Untuk menguji silahkan masukan satu variabel di matlab, misal >>a=2. Tampak di workspace muncul variabel ‘a’ dengan informasi jenis datanya di kolom berikutnya. Ketika ditulis clear pada command window maka variabel ‘a’ tidak ada lagi di workspace. Selain dengan clear workspace juga bersih ketika Matlab dimatikan (off) baik sengaja maupun karena kegagalan sistem (error).

Postingan ini sederhana tetapi uniknya saya mengerti instruksi “clc” ketika kuliah AI-Neuro Fuzzy. Rekan kuliah dari Thailand memberitahu instruksi tersebut, padahal saya belajar Matlab otodidak sejak 1999 setelah belajar Fortran (artinya 14 tahun .. he he). Beruntunglah rekan-rekan yang saat ini sudah ada google, youtube, blog, dan sumber-sumber informasi lainnya.

Matrix Manipulation Using Matlab Looping Function

Matrix manipulation is the power of Matlab. That’s why Matlab stands for Matrix Laboratory (not Mathematics laboratory). This software easily calculates many Matrix operation that difficult for other languages (c++, java, etc.). In addition, Matlab not only operates through its function but also uses looping tools similar to other language, i.e. ‘for-next’, ‘while-do’, etc. One of my best friends studying in Australia discussed about how to manipulate Matrix efficiently weeks ago. For example we have a matrix:

And we have another matrix, B=[1 2 3 4 5;6 7 8 9 10;11 12 13 14 15];

The question is how to create matrix C which contains column elements in B for every even number of column in A. Of course we can create manually based on the B value, but the problem is when the number of Matrix A and B are thousands, e.g. coordinates. In Matlab we are allowed to use “for-next” instruction to manipulate a matrix.

  • >> C=A;
  • for i=1:10
  • [rows cols]=size(B);
  • if cols>=i
  • C(:,2*i)=B(:,i);
  • end
  • end

The script will give the result:

Use function “size” to know maximum column of A and B. Of course you can try to create the other algorithms for this purpose. Tq

Mengekspor Bobot dan Bias ke Network JST

Cukup lama juga tulisan saya tentang “Seputar Jaringan Syaraf Tiruan” yaitu enam tahun yang lalu. Salah satu komentar yang cukup menarik adalah tentang bagaimana komponen JST yang berfungsi training mengirimkan hasil trainingnya (bobot dan bias) ke network JST agar bisa dipergunakan oleh aplikasi web-based yang memiliki JST di dalamnya. Sedikit berbeda dengan publikasi saya tentang Web-GIS yang baik training maupun simulating berada di desktop-GIS (Fig.1).

Dengan memanfaatkan fasilitas training JST Matlab, kita dapat mengetahui bobot dan bias hasil training yang telah dilakukan (lihat postingan sebelumnya mengenai cara membaca hasil pelatihan JST). Dengan memanfaatkan cara membaca bias dan bobot, kita dapat mengirimkannya ke JST yang telah dirakit terlebih dahulu. Postingan kali ini bermaksud sama-sama berdiskusi mengenai teknik untuk mengirimkan bias dan bobot hasil training ke JST yang ada.

A. Training JST dengan fungsi newff

Agar lebih gampang, contoh training dapat dilihat di help matlab (ketik saja help newff di command window Matlab). Atau copas script berikut ini:

  • load simplefit_dataset
  • net = newff(simplefitInputs,simplefitTargets,20);
  • net = train(net,simplefitInputs,simplefitTargets);
  • simplefitOutputs = sim(net,simplefitInputs);

Setelah enter ditekan, jendela pelatihan akan muncul seperti gambar di bawah ini. Tunggu sesaat hingga proses pelatihan selesai dijalankan.

B. Latihan Meng-update bobot JST Hasil Pelatihan

Untuk melihat variabel-variabel hasil pelatihan, kita dapat lakukan dengan menekan net di command window (jika variabel JST-nya “net” dan jika tidak, sesuai dengan namanya, biasanya network1 (default) jika dibuat di nntool).

  • sim(net,94)
  • ans =
  • 4.9494
  • Jawaban1=ans

Kode di atas adalah hasil awal JST ketika diberi masukan “94”, yaitu sebesar 4.9494. Berikutnya kita misalnya telah melakukan training lagi dengan data yang lebih baru dan akan meng-update dengan data baru. Sementara data yang lama adalah sebagai berikut:

  • >> net.IW
  • ans =
  • [20×1 double]
    • []
  • >> cell2mat(ans)
  • ans =
  • 28.3617
  • 27.9082
  • -27.8863
  • 26.6165
  • 23.2698
  • -15.0705
  • -20.3582
  • 22.0298
  • 28.3998
  • 28.0369
  • -27.9783
  • 27.8605
  • 27.8120
  • -27.7361
  • 28.0819
  • -28.8486
  • -29.2218
  • 26.3938
  • 26.8540
  • 28.1526
  • IWW=ans;

Di sini kita bisa mencoba melatih JST dengan data latih baru. Tetapi untuk gampangnya, sebagai perbandingan saja, misalnya IW di baris pertama misalnya “nol” (berwarna merah pada IW di atas). Insert dengan kode berikut:

  • IWW(1,1)=0

Sehingga baris pertama IW menjadi nol. Kembalikan variabel “mat” di atas menjadi “cell” mengingat bobot di Matlab adalah dalam bentuk cell.

  • IWWnew=mat2cell(IWW)
  • net.IW(1,1)=IWWnew

Di sini variabel baru IWWnew (konversi mat menjadi cell) disisipkan di net.IW yang merupakan bobot input JST.

  • >> sim(net,94)
  • ans =
  • 4.0079
  • Jawaban2=ans

Di sini kita uji dengan data test yang sama dengan sebelumnya (“94”), hasilnya ternyata berbeda dengan sebelumnya.

  • >> [jawaban1;jawaban2]
  • ans =
  • 4.9494
  • 4.0079

Perhatikan Jawaban1 dan Jawaban2 yang berbeda. Artinya JST sudah berubah karena update bobot di bagian input (net.IW). Untuk bias dan bobot sisi hidden layer dapat dilakukan dengan cara yang sama. Untuk mengirimkannya lewat mekanisme database, ada baiknya membaca buku yang telah kami tulis sebelumnya. Selamat mencoba.

Perbandingan NARXNET dengan NNTOOL untuk Peramalan Data Time-Series

Narnet merupakan penerapan neural network untuk prediksi data time series. Berbeda dengan prediksi data biasa yang mengandalkan atribut/variabel, prediksi data time series, atau dikenal dengan istilah proyeksi (projection), hanya mengandalkan riwayat data sebelumnya (historical data). Maka neural network untuk prediksi menjadikan data sebelumnya sebagai atribut yang digunakan saat pelatihan (training) maupun prediksi (simulating). Sementara itu, muncul Narxnet dengan istilah “x” yang berarti variabel eksternal (external). Variabel ini oleh matlab diberi istilah “external input” atau ada juga yang menyebut dengan istilah “intervention indicators” (lihat situs ini). Variabel ini tidak terlibat sebagai variabel yang berasal dari time series tetapi dijadikan variabel prediksi. Postingan yang lalu sepertinya cukup baik menjelaskan teknik ini.

Matlab telah memberikan layanan toolbox untuk penerapan Narxnet baik yang berbasis GUI maupun command. Yang berbasis command sepertinya lebih baik karena dapat digunakan untuk data berukuran kurang dari lima. Masalah yang sering muncul adalah akurasi hasil pelatihan ketika memprediksi data ke depan. Memang dapat dilakukan pelatihan ulang, tetapi tetap saja menjadi ragu-ragu untuk diterapkan, apalagi kesalahan yang terjadi bukan hanya dari sisi besaran melainkan arahnya (harusnya naik malah turun). Coba kita praktekan dengan data sederhana agar lebih mudah diketahui error-nya.

Data di atas merupakan data yang terdiri dari data time series dari satu sampai lima dan external input dari seribu hingga 1060. Kita diminta membuat Narxnet, melatihnya, dan memprediksi data setelah lima (tentu saja hasilnya dapat ditebak yaitu 6 dan 7). Listing berikut menggunakan toolbox Narxnet di Matlab. Atau buka panduannya dengan mengetik help narxnet di command window dan isi data time series dengan nama variabel t dan external input dengan nama variabel x. Jangan lupa tipe data yang digunakan adalah sequence.

  • t={1 2 3 4 5};
  • x={1000 1010 1020 1030 1040};
  • net = narxnet(1:2,1:2,10);
  • [X,Xi,Ai,T] = preparets(net,x,{},t);
  • net = train(net,X,T,Xi,Ai);
  • view(net)
  • Y = net(X,Xi,Ai)
  • perf = perform(net,Y,T)

Hasil training dapat dilihat pada gambar berikut (kiri) dan tampilan hasil Narxnet (kanan). Ada 7 plot yang tersedia untuk melihat kinerja pelatihan antara lain: performance, training state, error histogram, regression, time series response, error autocorrelation, dan input-error cross-correlation.

Step-Ahead Form

Step-Ahead form sering digunakan pada Nernet yang tanpa menggunakan External input. Perhatikan kode yang dicetak tebal di atas. Delay yang digunakan pada gambar di atas adalah 1 langkah. Fungsi yang diperlukan adalah fungsi Remove delay.

  • nets = removedelay(net);
  • view(net)
  • [Xs,Xis,Ais,Ts] = preparets(nets,x,{},t);
  • Ys = nets(Xs,Xis,Ais)
  • Ys =
  • [3.0000] [4.0000] [5.0000] [4.2465]

Hasilnya kurang menggembirakan, seharusnya 6.0000 tapi malah turun (4.2465). Salah satu cara untuk memperbaikinya adalah melakukan pelatihan ulang hingga diperoleh hasil yang memuaskan.

Multistep Prediction

Untuk Narxnet, ada pilihan lain yaitu Multistep prediction. Metode ini mengandalkan keunggulan dari external input. Makin banyak external input makin baik tetapi tentu saja persoalan berubah dari proyeksi menjadi prediksi biasa, dan data time series jadi tidak signifikan lagi manfaatnya.

Prinsip kerjanya adalah menggunakan lingkar terbuka (open loop) untuk merakit Narxnet dari data yang tersedia kemudian merubahnya menjadi lingkar tertutup (closed loop). Narxnet yang sudah dalam bentuk lingkar tertutup kemudian digunakan untuk memprediksi hanya berdasarkan data external input. Kembali ke kasus di atas, dengan Multistep prediction Narxnet dibagi menjadi dua segmen yaitu segmen dengan target/output yang diketahui dan yang hanya diketahui external input-nya saja (x). Di sini time stap yang tersedia hanya dua yaitu data keenam (1050) dan ketujuh (1060). Gunakan t yang sama dengan kasus sebelumnya, tetapi dengan x yang ditambah dengan dua data sebagai dasar patokan untuk memprediksi t.

  • x={1000 1010 1020 1030 1040 1050 1060};
  • numTimesteps = size(x,2);
  • knownOutputTimesteps = 1:(numTimesteps-5);
  • predictOutputTimesteps = (numTimesteps-4):numTimesteps;
  • x1 = x(1,knownOutputTimesteps);
  • t1 = t(1,knownOutputTimesteps);
  • x2 = x(1,predictOutputTimesteps);

Perhatikan penggunaan fungsi closeloop untuk membuat lingkar tertutup dari network yang telah dilatih sebelumnya.

  • [Xo,Xio,Aio,To] = preparets(net,x1,{},t1);
  • [Y1,Xfo,Afo] = net(Xo,Xio,Aio);
  • [netc,Xic,Aic] = closeloop(net,Xfo,Afo);
  • [Y2,Xfc,Afc] = netc(x2,Xic,Aic);

Hasilnya disimpan dalam variabel Y2 yakni [4.2465] dan [0.2789]. Sangat tidak akurat dan harus dilatih ulang. Untuk mengulangnya tinggal copy-paste lagi kode-kode di atas. Berikut untuk training kedua:

  • Y2 =
  • [3.0000] [4.0000] [5.0000] [7.2076] [8.8717]

Masih kurang akurat (terlalu besar). Berikut ini akan dicoba tidak dengan Narxnet melainkan NNTOOL seperti biasa apakah hasilnya lebih baik?

Prediksi Data Time Series dengan NNTOOL

Seperti dibahas di awal, data deret waktu yang lampau dijadikan variabel untuk memprediksi data berikutnya. Variabel external input ditambahkan sebagai data eksternal. Gunakan data berikut ini untuk training. Terus terang saya agak kagok dengan format kolom nntool, saya lebih suka format baris seperti tabel biasa, jadi saya menggunakan transpose setelah memasukan data dengan format baris agar berganti kolom yang sesuai dengan nntool.

  • data=[1 2 1020; 2 3 1030; 3 4 1040];
  • data=transpose(data);
  • target=[3;4;5];
  • target=transpose(target);

Panggil fungsi nntool untuk membuka GUI perancangan neural network (lebih jelasnya lihat postingan JST). Perhatikan penggunaan fungsi PURELIN agar neural network mampu memprediksi nilai yang diluar rentang data pelatihan.

Hasil pelatihan disimpan dengan nama network1 yang akan digunakan untuk memprediksi data yang akan datang. Dengan menggeser (shifting window) satu persatu, diperoleh data keenam dan ketujuh sebagai berikut.

  • dataenam=[4 5 1050];
  • dataenam=transpose(dataenam);
  • proj6=sim(network1,dataenam)
  • proj6 =
  • 6.0000
  • datatujuh=[5 6.0000 1060];
  • datatujuh=transpose(datatujuh);
  • proj7=sim(network1,datatujuh)
  • proj7 =
  • 7.0000

Perhatikan, hasilnya sangat akurat yaitu data keenam dan ketujuh berturut-turut 6.0000 dan 7.0000 hanya dengan sekali proses pelatihan. Itulah mengapa saya lebih suka menggunakan NNTOOL untuk meramalkan data baik dengan maupun yang tanpa external input. Problem ini sudah saya coba baik dengan Matlab 2008b maupun Matlab 2013. Mohon masukan dari pembaca.