Minggu, 04 Maret 2012

Logika Fuzzy (I)

Menghitung Fuzzy Inference Systems (FIS)


Hai…. Teman-teman…
Mau berbagi nih… Saya membuat tulisan mengenai Fuzzy Logic. Tulisan ini mencoba menghitung output keluaran fuzzy dengan menggunakan langkah matematis. Harapannya, dapat memberikan teman-teman gambaran mengenai bagaimana konsep dasar system fuzzy bekerja. Nah, hasil akhir kalkulasi ini selanjutnya akan dibandingkan dengan hasil menggunakan Fuzzy Toolbox pada Matlab. Pengenalan Fuzzy Toolbox dapat dilihat pada sesi Logika Fuzzy - Pengenalan FIS Editor (I).

Asumsinya, teman-teman sudah mempunyai sedikit pengetahuan dasar mengenai Fuzzy Logic. Walaupun tulisan ini sepenuhnya adalah hitungan matematis, namun akan lebih mudah kalau teman-teman menginstal Matlab dan Fuzzy Toolbox-nya. Ok?? ^_^

Well….. mari kita bahas sama-sama..

Nah.. ini contoh kasus kita:

Apa saja tahapan dalam FIS ?
  1.  Membuat himpunan dan input fuzzy
  2. Aplikasikan operator fuzzy
  3. Aplikasikan fungsi implikasi
  4. Komposisikan semua output
  5. Defuzzyfikasi
 Solusinya….

1.        Membuat himpunan dan input fuzzy
Nah, mari kita coba bahas satu persatu. Input kita adalah PELAYANAN dan MAKANAN. Nah, asumsikan jika Pelayanan kita kategorikan dalam JELEK, SEDANG dan BAGUS. Makanan kita bagi menjadi TENGIK dan LEZAT.
Output fuzzy adalah TIP, dan kita kategorikan menjadi MURAH, STANDAR dan MAHAL. Jadi, kesimpulannya sebagai berikut :

Pelayanan : Jelek, Sedang, & Bagus
Makanan : Tengik & Lezat
Tip : Murah, Standar, & Mahal


Input : Pelayanan = 7

Nah, pertama-tama kita bahas PELAYANAN. Fungsi keanggotaan (membership function, MF ) untuk pelayanan saya buat seperti gambar di bawah (tentunya teman-teman bias membuat dan mengatur jenis keanggotaan yang lain). Fungsi-fungsi ini  tersedia di Fuzzy Toolbox Matlab. Ketik nama fungsi ini di help Matlab kalau teman-teman masih belum jelas :) Nah,  berikut rangkumannya :

Jelek : Z-shaped built-in membership function (zmf)
Sedang : Gaussian curve built-in membership function (gaussmf)
Bagus : S-shaped built-in membership function (smf)



Semua MF memiliki nilai dari 0 sampai 1. Rumus matematisnya dirangkum seperti berikut ini :

 


 

 

 
Kita tahu bahwa nilai PELAYANAN=7. Kita tarik garis vertikal ke atas, lihat kurve yang dilalui dan tarik garis horizontal ke kanan. Dalam hal ini, hanya fungsi JELEK yang tidak dilalui. Mengapa? mari kita bahas selanjutnya. 
Kemudian, berapa nilai yang MF yang besesuaian? Nah, mari kita hitung bersama-sama berdasarkan rumus yang tertulis di atas.

 

 
Nilai a dan b pada fungsi keanggotaan (MF) JELEK bersesuaian dengan maksimim dan minimum fungsi tersebut. Sedangkan nilai x adalah input kita (dalam hal ini = 7).

 

 
Untuk keanggotaan SEDANG, nilai c besesuaian dengan pusatnya dan sigma besesuain dengan lebar fungsi tersebut. Demikian pula untuk keanggotaan BAGUS seperti pada fungsi keanggotaan JELEK. Untuk mempermudah, mari kita amati gambar di bawah ini.


Kalau kita masukkan nilai-nilai tersebut, kita mendapatkan sebagai berikut:


 
Mari kita lihat rentang dari tiap-tiap rumus di atas. Jelas, tanpa melihat kurva kita dapat memastikan bahwa dengan input = 7, fungsi keanggotaan JELEK tidak akan terpakai karena berada tidak berada pada rentang yang mencakup nilai 7. Fungsi SEDANG akan terpakai, begitu pula fungsi BAGUS (formula kedua) akan terpakai.


 

Kalau kita masukkan nilai 7 kedalam rumus yang terpakai, kita memperoleh :




Sampai pada langkah ini, input berupa PELAYANAN telah selesai dibahas. Selanjutnya kita akan bahan input berupa MAKANAN. Langkah yang dilakukan sama dengan sebelumnya.

(Bersambung ke Logika Fuzzy (II) )



Rabu, 01 Februari 2012

Welcome snow !!!

Setelah sekian lama ditunggu, akhirnya salju turun juga :) hehehe...
Welcome snow !!!  ^_^
Sempat agak kecewa, karena sampai akhir bulan februari belum turun juga. Nah, sekalinya turun langsung tebal sekali. Bahkan hari pertama ujian semester harus dibatalkan karena kondisi yang dirasa tidak kondusif.









Sabtu, 31 Desember 2011

Tulisan Singkat di Penghujung Tahun 2011

Saat ini udara kota Turin begitu dinginnya, hampir nol derajat. Ya, tampaknya winter ini semakin hari semakin dingin saja. Suasana malam yang dingin ini menjadi malam pergantian tahun menuju 2012.

Ini adalah malam tahun baru kedua saya di Italia. Kembali ke tahun lalu, sebuah memori seakan bangkit lagi. Adalah Piazza Vittorio Venetto, sebuah alun-alun terbesar di kota Turin, tempat dimana ribuan orang berkumpul untuk merayakan pergantian tahun. Di depan piazza ini, terbentang sungai terbesar di kota Turin, namanya sungai Po. Di seberang sungai inilah sekelumit kembang api beserta kelengkapannya dipasang. Seolah-olah tidak peduli karena udara begitu dinginnya, rasa ingin tahu untuk menikmati suasana pergantian tahun di kota ini begitu besarnya. Datang dan menunggu di pinggir sungai sampai akhirnya sejumlah kembang api diluncurkan tepat pukul 00.00. Hanya sendiri saat itu, tiada berkawan diantara ribuan orang yang berkumpul. Hehehehe...

Tahun ini begitu berbeda. Malam tahun baru ini cukup saya rayakan dengan hanya tinggal di apartemen yang hangat dan jauh dari keramaian. Menulis blog ini sambil tiduran dan .... sebentar lagi akan tidur. Hehehe... Namun tetap, harapan akan perubahan ke arah positif di tahun depat masih belum padam :)

Felice anno nuovo 2012!!!
Selamat tahun baru untuk teman-teman semua ^^

Ciao ciao ...

Senin, 26 Desember 2011

O My Dear Lord ...

O Sri Krishna, Tuhan yang hamba cintai ...
Maafkanlah hamba
Begitu banyak dosa yang telah hamba perbuat

O yang terkasih, berilah hamba kekuatan
Agar hamba menjadi lebih baik
Jangan biarkan hamba terjatuh lagi, Ya Tuhan

Radha Syamasundara, karuniailah cinta kasihMu
Hamba menderita Ya Tuhan...

Radha Rasesvara, bersihkanlah diri hamba
Hamba sudah sangat ternoda

Radha Ramana ...
Tumbuhkanlah karunia berupa bhakti dalam hati hamba
Sesungguhnya, Engkaulah kekasih kekal hamba, Ya Tuhan

Minggu, 25 Desember 2011

Jaringan Saraf Tiruan Menggunakan Neural Network Toolbox™ Matlab

Halo teman-teman… kali ini saya akan mencoba mengenalkan Jaringan Saraf Tiruan (JST) menggunakan Matlab dan Neural Network Tollbox. Mmmmm…. Ada satu syarat yang wajib untuk teman-teman lakukan, yaitu menginstal Matlab dan toolbox-nya. Program dalam tulisan ini dibuat dengan spesifikasi sebagai berikut:

Matlab Version 7.8 (R2009a)
Neural Network Toolbox Version 6.0.2 (R2009a)

Untuk mengecek versi yang terinstal di komputer teman-teman, bisa ketik perintah "ver" di command window pada Matlab

Mungkin sintax dalam program ini akan sedikit berbeda jika teman-teman memakai Matlab versi sebelum 7.6. Anyway, saya berasusmsi kalau teman-teman sudah memiliki pengetahuan dasar mengenai JST. Yuppp…. mari kita lanjutkan topik kita…. ^_^

Kasus :

Bayangkan jika kita mempunyai sekumpulan angka yang kita berikan nama matriks P, sebagai berikut:
P = [1 2 3 4 5 6 7 8 9 10]
Dan kita juga punya matriks lain, sebut matriks T :
T = [6 12 14 21 27 29 36 41 44 51]

Matriks P adalah input untuk JST kita dan T adalah targetnya. Dengan kata lain, kita akan mengajari P agar mencapai hasil seperti T. Paham, bukan? ^_^

Ada berbagai jenis algoritma dalam JST. Nah, untuk kasus ini saya akan menggunakan Backpropagation.

Neural Network Toolbox
Sekarang mari kita bermain-main menggunakan Neural Network Toolbox.

 
1.        Mari kita bangun arsitektur jaringannya.
Syntax:

net = newff(P,T,[S1 S2...S(N-l)],{TF1 TF2...TFNl},BTF,BLF,PF,IPF,OPF,DDF)

Penjelasan:
Mmmm…. Sintaknya panjang amat. Untuk kesempatan kali ini, kita akan mengurangi input dan hanya menggunakan beberapa saja. Parameter input yang lain kita biarkan pada nilai default-nya. Ok..? Nah, kita reduksi menjadi seperti ini :

net = newff(P,T,[S1 S2...S(N-l)])

P dan T masing-masing adalah input dan Target JST kita, sedangkan S1 S2...S(N-l) adalah jumlah neuron dalam layer JST. Asumsi kita membentuk arsitektur sebagai berikut :

 

Kita mempunya 2 layer tersembunyi (hidden layer), dan kita namai HL 1 dan HL2. HL 1 dan 2 masing-masing memiliki jumlah neuron 3 dan 2.

Nah, sampai saat ini, kita dapat memprogram JST kita sebagai berikut:

% input
P = [1 2 3 4 5 6 7 8 9 10];
% target
T = [6 12 14 21 27 29 36 41 44 51];
% bangun JST
JST = newff(P,T,[3 2]);

2.        Kita bisa mensimulasikan JST kita, karena pada saat ini Matlab sudah membangkitkan nilai-nilai bias dan bobot awal pada tiap-tiap konelsi dan neron. 

Sintax:

Y = sim(JST,P);

Hasilnya dapat kita plot dengan perintah berikut:

plot(P,T,'*',P,Y,'o');

    
Target yang ingin kita capai adalah lambang bintang (*), dan hasil simulasi diperlihatkan dengan tanda  lingkaran (o).

       * Jangan khawatir kalau hasilnya akan berbeda, karena Matlab akan membangkinkan bilangan acak.      Dengan kata lain, bobot dan bias yang dihasilkan akan berbeda, sehingga hasil akhirnya akan berbeda pula.

Sampai saat ini kita telah menulis sintak berikut:


% input
P = [1 2 3 4 5 6 7 8 9 10];
% target
T = [6 12 14 21 27 29 36 41 44 51];
% bangun JST
JST = newff(P,T,[3 2]);
% simulasikan JST
Y = sim(JST,P);
%plot hasilnya
plot(P,T,'*',P,Y,'o');

 Well……. Dengan kata lain, JST kita belum pintar… kita harus melatihnya agar pintar.

3.        Sekarang kita akan melatih JST kita agar pintar dan mencapai target yang diinginkan :)
Sintak yang kita gunakan sebagai berikut:

JST.trainParam.epochs = 5;
JST = train(JST,P,T);
       
Maksud sintak ini adalah kita akan melatih JST sebanyak 5 iterasi (epoch) maju-mundur (backpropagation). Kemudian akan muncul jendela nntraintool.

Untuk saat ini, mari kita abaikan dulu jendela ini. Kita lanjut ke langkah berikutnya.

4.        Sekarang kita simulasikan dan plot hasil pelatihan tadi.
Sintak :
Y = sim(JST,P);
plot(P,T,'*',P,Y,'o');

Diperoleh hasil seperti berikut :
 


Wah.. sepertinya JST kita sudah semakin cerdas. Tanda lingkaran sudah mendekati tanda bintang. Namun belum sepenuhnya mencapai target yang diinginkan. Sampai saat ini, sintak yang sudah kita buat adalah sebagai berikut:


% input
P = [1 2 3 4 5 6 7 8 9 10];
% target
T = [6 12 14 21 27 29 36 41 44 51];
% bangun JST
JST = newff(P,T,[3 2]);
% simulasikan JST
Y = sim(JST,P);
%plot hasilnya
plot(P,T,'*',P,Y,'o');
%latih JST sebanyak 5 epoch
JST.trainParam.epochs = 5;
JST = train(JST,P,T);
%simulasikan JST setelah pelatihan
Y = sim(JST,P);
plot(P,T,'*',P,Y,'o');

 
5.        Agar JST kita lebih pintar, kita harus melatihnya lebih banyak lagi. Sekarang kita naikkan epoch menjadi 30 dan selanjutnya kita latih dan simulasikan lagi.

Syntax :
    JST.trainParam.epochs = 30;
    JST = train(JST,P,T);
    Y = sim(JST,P);
    plot(P,T,'*',P,Y,'o');

     Hasil akhir yang diperoleh sebagai berikut:



Sintak lengkapnya sebagai berikut :

   % input
   P = [1 2 3 4 5 6 7 8 9 10];
   % target
   T = [6 12 14 21 27 29 36 41 44 51];
   % bangun JST
   JST = newff(P,T,[3 2]);
   % simulasikan JST
   Y = sim(JST,P);
   %plot hasilnya
   plot(P,T,'*',P,Y,'o');
   %latih JST sebanyak 5 epoch
   JST.trainParam.epochs = 5;
   JST = train(JST,P,T);
   %simulasikan JST setelah pelatihan
   Y = sim(JST,P);
   plot(P,T,'*',P,Y,'o');
   %naikkan epoch
   JST.trainParam.epochs = 30;
   JST = train(JST,P,T);
   Y = sim(JST,P);
   plot(P,T,'*',P,Y,'o');

Apa yang saya tulis adalah pengetahuan yang sangat dasar mengenai JST. Begitu pula dari sisi pemrograman. Untuk menghasilkan performance yang lebih baik, teman-teman dituntut untuk belajar lebih lanjut lagi dengan mengatur berbagai parameter dari JST tersebut, baik melalui pengaturan arsitektur JST, pengaturan bobot dan bias awal, momentum, metode pelatihan dan lain-lain.
       
Selamat belajar ^_^


Salam hangat..
Torino, 25 Desember 2011, 09.44PM


     

Dear Lord...

Natal tahun ini

Wah... Tidak terasa. Hari ini natal kedua saya sejak melanjutkan studi di kota ini, Turin, Italia.

Teringat tahun lalu. Tinggal sendiri di apartemen lantai 8. Teman satu apartemen pulang ke Indonesia. Seperti biasa, udara winter sangat dingin... Yg bikin berkesan karena heater di apartemen mati! Hahaha.. Dinginnya mantap, sampe ke tulang rusuk. Belum lagi harus belajar karena akan ujian stelah liburan. Maklum, semester pertama masih deg-degan. Hahaha. Terpaksa belajar dengan tubuh terbungkus selimut tebal! Belajarnya tidak di meja belajar, tapi di atas kasur. Hehehe. Tapi tidak dapat dipungkiri, apartemen ini adalah salah satu yang terbaik! Apalagi dr segi ketenangan dan lokasinya yang strategis.

This year is totally different!! Natal kedua ini benar-benar berbeda. Setelah pindah apartemen, sekarang dapat di lantai 1. Heater menyala dengan panasnya. Flatmate teman-teman dari vietnam. Di rumah ramai dan penuh canda tawa, saling ejek satu sama lain. Hehehe..

Yup.. Tetap bersyukur atas segala nikmat karunia ini :)

Torino, 25 Desember 2011, 08.41 PM

Kamis, 22 Desember 2011

Turin pagi ini

Hari ini, seperti biasa, udara di kota ini begitu dingin. Saat tulisan ini dibuat, suhu menunjukkan 2,3 derajat celcius. Mmmm.... Masih seperti hari-hari sebelumnya, hari inipun saya berharap salju segera turun. hehehe.. kangen sama salju euy!!!

Wah, tahun ini salju terancam tidak turun nih T_T
Denger-denger sih bakalan turun Januari tahun depan. well.... coba saya buktikan...

Salam hangat,
Torino, 22 Desember 2011

Water Filling ... My new blog's name

Mmmm.. lama sekali tidak memposting sesuatu di blog ini. Lama sudah terbengkalai. Parahnya, saya lupa alamat email dan password untuk login ke blog ini! Wuih... pemilik blog yang aneh. ck.ck.ck..

Kasihan juga rasanya. Pagi ini, saya sedikit merubah penampilannya.... ganti layout, ganti warna, ganti jenis tulisan, dan..... yang paling mendasar berganti alamat blog!!! hahaha....
Moving from 'hasrat pujangga' to 'water filling' ...

Mmm... why water filling was chosen? well... alasannya simple. Saya enak mendengarnya. hehe.. Dan, dari mana nama ini muncul? Istilah water filling saya dapatkan karena mengikuti kuliah Communication System. Water filling adalah suatu metode untuk mendistribusikan power pada suatu channel berdasarkan atenuasi yang terjadi di channel tersebut. Sistem ini diterapkan pada sistem komunikasi menggunakan metode OFDM (Orthogonal Frequency-division Multiplexing). OFDM adalah sistem untuk mengirimkan data menggunakan multiple frequency carrier. Untuk memperoleh sistem distribusi yang tepat, power didistribusikan seperti memasukkan air ke tiap kotak yang berbeda-beda ketinggian dasarnya, namun permukaan keseluruhan kotak tersebut sama. Well.... mungkin bagi beberapa dari teman2 kebingungan (saya juga tidak menjelaskan dengan baik. hehehe). Coba deh lihat gambar berikut :

source : Communication systems course slide by Roberto Garello (Politecnico di Torino, Italy)

c adalah kapasitas channel, sedangkan alpha adalah atenuasi yang terjadi di tiap kotak (bins). Metode ini dikenal efektif untuk mengirimkan data, baik pada sistem dengan atau tanpa kabel (wireless). welll..... mungkin sekian saja penjelasan ilmiah water filling (saya masih harus banyak belajar mengenai topik ini. hehehe)

Lha... apa hubungannya dengan nama blog???? hehehe... enak didengar aja sih. Lagipula saya punya filosofi sendiri mengenai water filling ini. Kita harus bisa menerapkan kecerdasan dan kekuatan kita (power) dalam berbagai situasi (atenuasi), namun tetap menjaga "standard" atau prinsip hidup kita (channel). Kapan kita harus keras, kapan harus mengalah, kapan harus bicara, kapan harus betindak, dsb. hehehehe ^_^

Yup... semoga teman2 yang menyempatkan diri berkunjung ke blog ini mendapatkan manfaat.. Salam hangat.... (Torino, 22 Desember 2011)