U N IVE R S ITAS GU NADAR MA FAKULTAS TEKNOLOGI INDUSTRI
METODE EKSTRAKSI DATA UNTUK PENGENALAN HURUF DAN ANGKA TULISAN TANGAN DENGAN MENGGUNAKAN JARINGAN SYARAF BUATAN PROPAGASI BALIK Disusun oleh : Nama NPM / NIRM Fakultas Jurusan Pembimbing
: Apit Pria Nugraha : 50497062/ 973137716750066 : Teknologi Industri : Teknik Informatika : Dr. rer. nat. Dipl. Phys. A. Benny Mutiara, Ssi., Skom
Diajukan Guna Melengkapi Sebagian Syarat Dalam Mencapai Gelar Sarjana Strata Satu (S1)
J A K A R T A 2002
Lembar Pengesahan
Komisi Pembimbing No. Nama 1. Dr. rer.nat. Dipl. Phys. A. Benny Mutiara, Ssi., Skom. 2. Ernastuti, Ssi., MIKom. 3. Tubagus Maulana, Skom., Meng.Sc. Tanggal Sidang :
Jabatan Ketua Anggota Anggota 23 Januari 2002
Panitia Ujian No. 1. 2. 3. 4. 5.
Nama Dr. Ravi Ahmad Salim Drs. Edi Sukirman, MM. Dr. rer.nat. Dipl. Phys. A. Benny Mutiara, Ssi., Skom. Ernastuti, Ssi., MIKom. Tubagus Maulana, Skom., Meng.Sc. Tanggal Lulus :
Jabatan Ketua Sekretaris Anggota Anggota Anggota 23 Januari 2002
Mengetahui, Depok,
Januari 2002
Pembimbing,
Bagian Sidang Ujian,
Dr. rer. nat. Dipl. Phys. A. Benny Mutiara, Ssi.,Skom.
Drs. Edi Sukirman MM.
Abstraksi 50497092 . 973137716750066 Apit Pria Nugraha Metode Ekstraksi Data Untuk Pengenalan Huruf dan Angka Tulisan Tangan dengan Menggunakan Jaringan Syaraf Buatan Propagasi Balik Skripsi . Fakultas Teknologi Industri, 2001 Kata Kunci : Jaringan Syaraf Buatan, Propagasi Balik, neuron, sampel, region, LearnRates, Momentum, Delphi, citra, pixel ( xii + 70 + Lampiran) Pada penulisan ini penulis menyajikan suatu metode untuk mengenali pola huruf dan angka tulisan tangan dengan menggunakan konsep jaringan syaraf buatan propagasi balik. Jaringan syaraf buatan yang digunakan menggunakan fungsi aktivasi sigmoid pada semua lapisannya, juga struktur neuronnya bersifat kaku (tidak fleksibel). Adapun metode pengenalan pola huruf dan angka tulisan tangan tersebut difokuskan pada cara pengekstrakan data dari sampel yang telah ada. Langkahlangkah pengekstrakan data tersebut adalah pertama, membagi sampel menjadi beberapa area pengamatan (region). Kedua, dari setiap region tersebut diambil nilai pixel yang aktifnya, sehingga didapat data numerik sebanyak jumlah region yang ada. Ketiga, data numerik yang sudah dihasilkan, dinormalisasi dengan cara perbandingan tetap, dimana setiap data numerik dari masing-masing region tadi dibagi dengan nilai terbesar dari semua data numerik dari sampel yang sama. Untuk membuktikan metode tersebut penulis membuat suatu aplikasi pendukung yaitu CharCognitron dengan menggunakan bahasa pemrograman Delphi 6.0 Enterprise. Adapun langkah-langkah penganalisaan yang pertama kali dilakukan adalah menentukan karakteristik jaringan syaraf buatan terbaik untuk metode ini. Kemudian, dianalisa komposisi region terbaik untuk sampel yang akan digunakan sehingga dapat memberikan hasil akhir yang terbaik. Hasil akhir dari penganalisaan tersebut menunjukkan bahwa pola yang dihasilkan dengan menggunakan metode tersebut dapat dikenali dengan baik oleh jaringan syaraf buatan. Daftar Pustaka (1987 – 1999) iii
Kata Pengantar Alhamdulillah, segala puji hanya patut dipanjatkan ke hadirat-Mu yaa Robbi, hanya atas berkat rahmat, karunia dan kemurahan Engkau-lah, akhirnya penulis dapat menyelesaikan tugas akhir kuliah ini. Sesungguhnya semua keberhasilan dan kesuksesan hanyalah kuasa-Mu yang memberi, tiada daya dan upaya yang bisa dilakukan tanpa izin dari Engkau. Sama sekali tidak mudah bagi penulis untuk bisa menyelesaikan tugas akhir ini. Banyak sekali hambatan maupun rintangan yang menghadang. Penulis sangat menyadari segala keterbatasan yang dimiliki, sehingga sangatlah tidak mungkin bagi penulis dapat menyelesaikan penulisan ini tanpa bantuan pihak lain. Selain hambatan teknis dengan ketiadaan fasilitas yang memadai serta curahan waktu dan pikiran yang tidak seiring sejalan, ada juga hal-hal yang membuat penulis semakin merasa bersyukur atas nikmat yang diberikan-Nya. Diantaranya, penulis menjadi lebih memahami bagaimana rasanya berada dalam kondisi yang penuh kepahitan dan hampir dilanda keputus-asa-an. Namun sekali lagi, alhamdulillah, selain karena izin Allah SWT serta bantuan dari berbagai pihak, terutama dari Ibundaku tercinta yang tiada henti-hentinya selalu mendukung dan memberi dorongan dengan sejuta kasih sayang, sehingga akhirnya semuanya segera akan berakhir dan berganti. Adapun tujuan dari tugas akhir penulisan ini adalah untuk melengkapi sebagian syarat dalam mencapai gelar sarjana (S1). Untuk itu dalam kesempatan ini, penulis ingin sekali mengucapkan terima kasih yang mendalam kepada : 1. Ibu Prof. E. S. Margianti, SE., MM., selaku Rektor Universitas Gunadarma; 2. Bapak Drs. Soebiyantoro, MMEng., sebagai Dekan Fakultas Teknologi Industri; 3. Bapak Dr. rer. nat. Dipl. Phys. A. Benny Mutiara, Ssi., Skom., sebagai Ketua Jurusan Teknik Informatika dan sebagai Dosen pembimbing penulisan, atas segala bimbingan dan perhatiannya selama ini;
iv
4. Bapak Irwan Arifin Ssi., sebagai pembimbing teknis yang paling handal dan selalu siap untuk memberikan bantuan, juga sebagai Dosen yang sangat berdedikasi tinggi di dunianya, terimakasih atas segala bantuan yang bapak dedikasikan dengan segala ketulusan; 5. Ibunda Tercinta dan almarhum Ayahanda, tanpa bimbingan Engkau berdua sejak lahir, tidak akan pernah ada kata-kata ini untuk diucapkan; 6. Kakak-kakak-ku tersayang, apa jadinya adikmu ini tanpa dorongan dan bantuan moril maupun materil gratis dari kalian selama ini, terima kasih tercurah untuk kalian terutama atas fasilitas dan kasih sayang yang diberikan selama ini; 7. Adinda Rika yang selama ini selalu memberikan dukungan dan bantuan tanpa pamrih, untuk semangatnya yang tak pernah padam; 8. Rahimi Satria, atas bantuan fasilitasnya yang telah diberikan tanpa pamrih; 9. Nida, Ela, Tari, Yan, Fadila, Bowo Gondrong (sekarang botak), yang tidak pernah kehabisan pengertian dan semangat untuk dicurahkan, Life is desert without you guys!; 10. Dan untuk semua pihak yang telah memberikan bantuan sekecil apapun dalam bentuk apapun, yang tidak mungkin penulis sebutkan satu persatu di sini; Penulis juga menyadari bahwa dalam isi dari tulisan ini masih jauh dari sempurna. Oleh karena itu, penulis sangat mengharapkan kritikan dan saran yang konstruktif dalam bentuk apapun. Semoga tulisan ini dapat memberikan manfaat bagi para pembacanya. Akhirnya hanya ucapan terima kasih dan do’a yang bisa penulis berikan kepada semua pihak tersebut. Hanya Allah-lah sebaik-baik pemberi balasan, semoga Allah selalu memberikan rahmat taufik, hidayah, dan karunia-Nya kepada kita semua serta memberikan ganjaran yang setimpal atas semua jasa yang telah diberikan. Amin. Yaa Robbal Alamin.
Jakarta,
Desember 2001
Penulis v
Daftar Isi
Halaman Judul ................................................................................................... Lembar Pengesahan ........................................................................................... Abstraksi ............................................................................................................ Kata Pengantar .................................................................................................... Daftar Isi ............................................................................................................ Daftar Gambar ................................................................................................... Daftar Tabel ....................................................................................................... Daftar Lampiran ................................................................................................. Bab I
i ii iii iv vi ix xi xii
Pendahuluan ....................................................................................... 1.1. Latar Belakang ............................................................................ 1.2. Rumusan Masalah ....................................................................... 1.3. Batasan Masalah ......................................................................... 1.4. Tujuan Penulisan ........................................................................ 1.5. Metode Penelitian ....................................................................... 1.6. Sistematika Penulisan .................................................................
1 1 2 2 2 3 3
Bab II Landasan Teori .................................................................................. 2.1. Unsur-unsur Mendasar Pengolahan Citra ................................... 2.1.1. Pengolahan Citra ............................................................. 2.1.2. Citra atau Image pada Komputer .................................... 2.2. Konsep Dasar Jaringan Syaraf Buatan ....................................... 2.2.1. Konfigurasi Jaraingan Syaraf Buatan ............................. 2.2.2. Propagasi Balik (Back Propagation) .............................. 2.2.3. Fungsi Aktivasi ............................................................... 2.2.4. Metode Output ................................................................ 2.3. Dasar-dasar Pemrograman Borland Delphi 6.0 Enterprise ........ 2.3.1. Lingkungan Pengembangan Terintegrasi ........................ 2.3.2. Komponen-komponen Delphi ......................................... 2.3.3. Struktur Pemrograman .................................................... 2.3.3.1. Struktur Perulangan .......................................... 2.3.3.2. Struktur Percabangan .......................................
4 4 4 4 7 10 11 12 14 16 17 19 21 21 22
Bab III Implementasi Konsep ........................................................................ 3.1. Analisa Permasalahan ................................................................. 3.2. Metode Akuisisi Data ................................................................. 3.2.1. Karakteristik Sampel ....................................................... 3.2.2. Ekstraksi Data dari Sampel ............................................ 3.2.3. Normalisasi Data Sampel ............................................... 3.2.4. Akumulasi Data Numerik ............................................... 3.3. Struktur Jaringan Syaraf Buatan ................................................. 3.3.1. Penggunaan algoritma Propagasi Balik .......................... 3.3.2. Penggunaan fungsi aktivasi Sigmoid ...............................
24 24 24 25 25 26 28 28 29 29
vi
3.3.3. Parameter-parameter penentu ......................................... 3.4. Implementasi Konsep Pengenalan Citra Huruf dan Angka pada Program Aplikasi CharCognitron ............................................... 3.4.1. Perancangan Input Output .............................................. 3.4.1.1. Rancangan CharCognitron ............................... 3.4.1.2. Rancangan Sample Builder ............................... 3.4.1.3. Rancangan Learning Activity ............................ 3.4.1.4. Rancangan Testing Activity .............................. 3.4.1.5. Rancangan Open/Save Dialog .......................... 3.4.1.6. Rancangan CheckTarget Dialog ...................... 3.4.1.7. Rancangan Reports Dialog ............................... 3.4.2. Memulai Aplikasi CharCognitron ................................... 3.4.2.1. Membuat Proyek baru ....................................... 3.4.2.2. Membuka Proyek yang sudah ada .................... 3.4.2.3. Menyimpan Proyek yang sudah dibuat ............. 3.4.2.4. Menutup File Proyek ........................................ 3.4.2.5. Menutup Aplikasi............................................... 3.4.3. Manipulasi Sampel pada Modul Sample Builder ............ 3.4.3.1. Membuat Sampel baru ...................................... 3.4.3.2. Membuka File Sample yang sudah ada ............ 3.4.3.3. Menyimpan File Sampel .................................... 3.4.3.4. Menutup File Sampel......................................... 3.4.3.5. Menambah Sampel ............................................ 3.4.3.6. Menghapus Sampel ........................................... 3.4.3.7. Mengubah komposisi Region ............................ 3.4.3.8. Mengubah Tampilan data pada DataGrid ........ 3.4.3.9. Tombol-tombol Navigasi ................................... 3.4.4. Proses belajar dengan Modul Learn Activity ................... 3.4.4.1. Mengganti Tampilan HiddenNeuron yang aktif .......................................................... 3.4.4.2. Meng-inisialisasi nilai acak .............................. 3.4.4.3. Me-nol-kan nilai JSB ........................................ 3.4.4.4. Menentukan nilai-nilai parameter penentu ...... 3.4.4.5. Memulai proses belajar ..................................... 3.4.4.6. HardTrapping MatchLevel .................................... 3.4.4.7. Menampilkan kotak dialog Check Target ......... 3.4.4.8. Menampilkan kotak dialog Learning Reports ... 3.4.4.9. Meng-inisialisasi ulang JSB .............................. 3.4.5. Menguji JSB menggunakan Modul Testing Activity .......
30
Bab IV Analisa dan Simulasi Percobaan ...................................................... 4.1. Mempersiapkan Sampel ............................................................. 4.1.1. Karakteristik Sampel yang Baik ..................................... 4.1.2. Optimasi dan Efektifitas Jumlah Sampel ........................ 4.2. Simulasi Aktiitas Belajar ............................................................. 4.2.1. Batasan dan Ketentuan Percobaan .................................. 4.2.2. Pengaruh LearnRates ...................................................... 4.2.3. Pengaruh Momentum ......................................................
53 53 53 54 55 55 56 58
vii
31 32 33 34 35 37 38 39 40 40 40 41 42 42 43 43 44 44 44 45 45 45 45 46 46 47 47 47 48 48 48 50 50 51 51 52
4.2.4. Pengaruh Jangkauan Nilai Awal ..................................... 61 4.3. Pengaruh Komposisi Region pada Sampel terhadap JSB ........... 65 4.4. Hasil Akhir Percobaan dengan Sampel lain ............................... 67 Bab V Penutup ............................................................................................... 69 5.1. Kesimpulan ................................................................................. 69 5.2. Saran ........................................................................................... 70 Daftar Pustaka ................................................................................................. 71 Lampiran ........................................................................................................... 72
viii
Daftar Gambar
Gambar 2.1. Gambar 2.2. Gambar 2.3. Gambar 2.4. Gambar 2.5. Gambar 2.6. Gambar 2.7. Gambar 2.8. Gambar 2.9. Gambar 2.10. Gambar 2.11.
a. Contoh citra biner; b. Contoh citra Abu ............................. Hubungan antar neuron biologis ............................................ FeedForward Network ........................................................... Recurrent Network ................................................................. Grafik fungsi Sigmoid ............................................................ Grafik fungsi Tangen Hiperbolik ........................................... Grafik fungsi Frank ................................................................ Tampilan Main Menu ............................................................. Tampilan Object Inspector ..................................................... Tampilan Visual Form Designer ............................................ Tampilan Source Code Editor ................................................
6 8 10 11 13 14 14 17 18 18 19
Gambar 3.1. Gambar 3.2. Gambar 3.3. Gambar 3.4. Gambar 3.5. Gambar 3.6. Gambar 3.7. Gambar 3.8. Gambar 3.9. Gambar 3.10. Gambar 3.11. Gambar 3.12. Gambar 3.13. Gambar 3.14. Gambar 3.15. Gambar 3.16. Gambar 3.17. Gambar 3.18. Gambar 3.19. Gambar 3.20. Gambar 3.21. Gambar 3.22. Gambar 3.23.
25 26 29 32 33 34 35 36 37 38 39 40 41 41 42 43 44 45 46 47 48 49
Gambar 3.24. Gambar 3.25. Gambar 3.26. Gambar 3.27.
Contoh sampel yang merepresentasikan huruf ‘A’................. Pembagian Region pada sample berikut nilai pixel aktifnya . Struktur Jaringan Syaraf Buatan yang digunakan .................. Topologi CharCognitron ........................................................ Rancangan CharCognitron ..................................................... Rancangan Modul Sample Builder ......................................... Rancangan Modul Learning Activity | Structure .................... Rancangan Modul Learning Activity | Learning..................... Rancangan Modul Testing Activity ......................................... Rancangan Open/Save Dialog ............................................... Rancangan CheckTarget Dialog ............................................ Rancangan Reports Dialog .................................................... Tampilan awal Aplikasi CharCognitron ................................ Tampilan Kotak Dialog Open Project .................................... Tampilan awal Modul Sample Builder ................................... Tampilan Modul Sample Builder | New Sample .................... Tampilan Modul Sample Builder | Load Sample ................... Mengatur komposisi Region .................................................. Mengubah tampilan data pada DataGrid .............................. Tampilan awal modul modul Learning Activity | Structure ... Inisialisasi nilai acak ............................................................. Tampilan awal modul modul Learning Activity | Learning.... Tampilan modul Learning Activity | Learning pada epoch = 100 .................................................................... Kotak dialog HardTrapping MatchLevel ............................... Kotak dialog Check Target .................................................... Kotak dialog Learning Reports .............................................. Tampilan modul Testing Activity...........................................
Gambar 4.1. Gambar 4.2.
Contoh sampel yang baik ....................................................... Contoh sampel yang tidak baik ..............................................
53 54
ix
49 50 50 51 52
Gambar 4.3. Gambar 4.4. Gambar 4.5. Gambar 4.6. Gambar 4.7. Gambar 4.8. Gambar 4.9. Gambar 4.10. Gambar 4.11. Gambar 4.12. Gambar 4.13. Gambar 4.14. Gambar 4.15. Gambar 4.16. Gambar 4.17. Gambar 4.18. Gambar 4.19. Gambar 4.20. Gambar 4.21. Gambar 4.22. Gambar 4.23. Gambar 4.24. Gambar 4.25. Gambar 4.26. Gambar 4.27. Gambar 4.28. Gambar 4.29.
Simulasi 1 Pengaruh LearnRates pada LearnRates = 0,1; Momentum = 0 ....................................................................... Simulasi 2 Pengaruh LearnRates pada LearnRates = 0,2; Momentum = 0 ....................................................................... Simulasi 3 Pengaruh LearnRates pada LearnRates = 0,5; Momentum = 0 ....................................................................... Simulasi 4 Pengaruh LearnRates pada LearnRates = 0,9; Momentum = 0 ....................................................................... Simulasi 5 Pengaruh LearnRates pada LearnRates = 1; Momentum = 0 ....................................................................... Simulasi 1 Pengaruh Momentum pada LearnRates = 0,2; Momentum = 0,1 ..................................................................... Simulasi 2 Pengaruh Momentum pada LearnRates = 0,2; Momentum = 0,2 ..................................................................... Simulasi 3 Pengaruh Momentum pada LearnRates = 0,2; Momentum = 0,5 ..................................................................... Simulasi 4 Pengaruh Momentum pada LearnRates = 0,2; Momentum = 0,8 ..................................................................... Simulasi 5 Pengaruh Momentum pada LearnRates = 0,2; Momentum = 0,9 ..................................................................... Simulasi 6 Pengaruh Momentum pada LearnRates = 0,2; Momentum = 1 ........................................................................ Simulasi 1 Pengaruh Jangkauan pada jangkauan 0 s/d +2 ..... Simulasi 2 Pengaruh Jangkauan pada jangkauan 0 s/d +5 ..... Simulasi 3 Pengaruh Jangkauan pada jangkauan -5 s/d 0 ..... Simulasi 4 Pengaruh Jangkauan pada jangkauan -2 s/d 0 ..... Simulasi 5 Pengaruh Jangkauan pada jangkauan -5 s/d +2 .... Simulasi 6 Pengaruh Jangkauan pada jangkauan -2 s/d +5 .... Simulasi 7 Pengaruh Jangkauan pada jangkauan -2 s/d +2 .... Simulasi 8 Pengaruh Jangkauan pada jangkauan -5 s/d +5 .... Simulasi 1 Pengaruh Region pada Region = 5*4 ................... Simulasi 2 Pengaruh Region pada Region = 4*5 ................... Simulasi 3 Pengaruh Region pada Region = 4*4 ................... Simulasi 4 Pengaruh Region pada Region = 3*3 ................... Simulasi 5 Pengaruh Region pada Region = 4*3 ................... Simulasi 6 Pengaruh Region pada Region = 3*4 ................... Simulasi 1 Sample2 [‘a’,’i',’u’,’e’,’o’] [20/100] .................... Simulasi 2 Sample3 [‘0’,’1',’2’,’3’,’4’.’5’] [10/100] .............
x
56 57 57 57 58 59 59 59 60 60 60 61 62 62 62 63 63 63 64 65 65 66 66 66 67 68 68
Daftar Tabel
Tabel 2.1. Contoh representasi output ............................................................
15
Tabel 3.1. Normalisasi dari contoh ................................................................ Tabel 3.2. Distribusi Neuron ..........................................................................
27 28
Tabel 4.1. Tabel 4.2. Tabel 4.3. Tabel 4.4. Tabel 4.5. Tabel 4.6.
54 58 61 64 67 68
Komposisi Sampel ......................................................................... Hasil percobaan pengaruh LearnRates .......................................... Hasil percobaan pengaruh Momentum .......................................... Hasil percobaan pengaruh Jangkauan ........................................... Hasil percobaan pengaruh Region ................................................. Hasil akhir percobaan dengan semua sampel ...............................
xi
Daftar Lampiran
Lampiran A.
Tabel Konversi Kode Target ................................................
72
Lampiran B.1. Tabel Data Sample1 belum ternormalisasi .......................... Lampiran B.2. Tabel Data Sample1 sudah ternormalisasi ...........................
73 77
Lampiran C.1. Data Simulasi Hasil Terbaik Sample1 ................................. Lampiran C.2. Data Simulasi Hasil Terbaik Sample2 ................................. Lampiran C.3. Data Simulasi Hasil Terbaik Sample3 .................................
80 82 84
Listing Kode Program CharCognitron.dpr ....................... Listing Kode Unit FrmCC.pas .......................................... Listing Kode Unit GlobalSB.pas ...................................... Listing Kode Unit GlobalNN.pas ...................................... Listing Kode Unit FrmCT.pas ........................................... Listing Kode Unit FrmRep.pas ...........................................
86 87 102 112 120 122
Lampiran D.1. Lampiran D.2. Lampiran D.3. Lampiran D.4. Lampiran D.5. Lampiran D.6.
Lampiran E.1. Flowchart Proses Pengenalan Pola ...................................... 124 Lampiran E.2. Flowchart Data Gathering ……........................................... 125 Lampiran E.3. Flowchart Prosedur Eksperimen ......................................... 126
xii
Bab I Pendahuluan 1.1.
Latar Belakang Manusia pada hakikatnya selalu mempunyai kecenderungan untuk
membuat segala sesuatu menjadi lebih mudah bagi dirinya dengan berbagai cara. Misalnya dengan membuat alat-alat (tools/device) sesuai dengan keperluannya, sehingga karenanya terciptalah komputer yang sangat diakui kehandalannya dalam hal mempermudah pekerjaan manusia. Pada saat ini manusia menjadi semakin bergantung pada penggunaan komputer untuk menyelesaikan berbagai kegiatan ataupun tugas yang harus diselesaikannya. Hal ini menjadi dasar pemikiran munculnya teknologi yang dibuat sedemikian rupa sehingga mesin yang dalam hal ini diwakili oleh komputer, dapat berpikir dan bertindak seperti layaknya manusia sehingga terbentuklah suatu disiplin ilmu baru yang seringkali disebut sebagai Artificial Intelegence (AI) atau Intelegensia Buatan. Sebagai suatu disiplin ilmu, AI berfokus pada permasalahan yang berhubungan dengan pengadopsian kemampuan alami manusia dalam berfikir dan bertindak menjadi sesuatu yang dapat dipetakan secara logis ke dalam suatu mekanisme yang dikenali oleh komputer. AI memiliki berbagai cabang pembahasan, diantaranya yaitu Artificial Neural Network (ANN) atau Jaringan Syaraf Buatan, Fuzzy Logic atau Logika Samar, dan Expert Systems atau Sistem Pakar. Secara awam, aspek yang cukup penting yang mendasari berbagai teori dalam AI adalah sistem pengenalan pola (Pattern Recognizing) yang merupakan bagian dari pengimplementasian ANN secara praktis. Sistem pengenalan pola merupakan komponen penting dalam proses peniruan kemampuan inderawi manusia terutama penglihatan dan pendengaran. Sebagai contoh, untuk meniru indera penglihatan manusia, komputer harus mempunyai suatu mekanisme standar dan logis dalam mengenali pola yang ada pada suatu citra yang sedang diproses. Dari sinilah penulis mendapatkan motivasi untuk mencoba suatu konsep sederhana untuk mengenali pola dari suatu citra sehingga dapat diidentifikasi dengan baik oleh komputer. 1
2
1.2.
Rumusan Masalah Permasalahan utama yang terjadi apabila hendak mengenali suatu pola
tertentu dan mengumpankannya ke dalam suatu proses jaringan syaraf buatan adalah bagaimana proses akuisisi data dilakukan sehingga menghasilkan sejumlah data numerik yang representatif dan konsisten terhadap sampel yang diberikan.
1.3.
Batasan Masalah Dalam penulisan ini, penulis mencoba mengaplikasikan suatu metoda
sederhana untuk mengenali suatu citra sehingga dapat diidentifikasi dengan baik oleh komputer dengan memanfaatkan berbagai teori seperti Image Proccessing, Artificial Neural Networks, serta pemahaman yang memadai mengenai bahasa pemrograman yang penulis gunakan. Citra yang akan diproses akan dibatasi pada citra yang merepresentasikan huruf-huruf alpabet berikut angka-angka arab secara singular. Program bantu yang penulis buat untuk mensimulasikan metoda ini dibuat dengan menggunakan Bahasa Pemrograman Borland Delphi 6.0 Enterprise pada sistem operasi yang mendukung.
1.4.
Tujuan Penulisan Tujuan utama dari penulisan ini adalah untuk menganalisa dan
membuktikan bahwa metoda sederhana untuk mengekstraksi data dari sampel yang berupa huruf dan angka tulisan tangan yang penulis buat dapat diimplementasikan dengan baik sesuai dengan tujuannya sehingga komputer dapat mengidentifikasi citra huruf dan angka tulisan tangan secara baik dan konsisten. Hal ini dapat diukur dengan melihat bahwa dengan menggunakan metode yang dimaksud, suatu jaringan syaraf buatan tertentu dapat ‘mempelajarinya’ serta mengenali pola-pola yang diberikan. Selain itu diharapkan dapat diperoleh konsep sederhana yang dapat mendasari dan dapat diimplementasikan pada suatu proses otomatisasi, misalnya OCR (Object Character Reader).
3
1.5.
Metode Penelitian Untuk
mendapatkan
bahan-bahan
dan
masukan-masukan,
penulis
melakukan studi kepustakaan dengan membaca buku-buku, makalah serta informasi-informasi yang tersebar di internet mengenai jaringan syaraf buatan ataupun lebih spesifik lagi mengenai pengenalan pola. Selain itu penulis juga melakukan studi lapangan dengan mengamati perkembangan kebutuhan akan pengenalan pola dengan cara melakukan penelitian terhadap beberapa kegiatan inderawi manusia untuk lebih memahami cara kerjanya sehingga diharapkan simulasi yang dibuat menggunakan komputer dapat sedekat mungkin mirip dengan cara kerja indera manusia. Juga tidak sedikit waktu yang dihabiskan untuk melakukan wawancara dengan beberapa ahli di bidang terkait.
1.6.
Sistematika Penulisan Adapun sistematika dari penulisan ini adalah sebagai berikut : Bab I merupakan pendahuluan yang menjelaskan tentang latar belakang
masalah, tujuan penulisan ilmiah, batasan masalah, metode penelitian yang digunakan, dan sistematika penulisan ilmiah. Bab II membahas tentang landasan teori, yaitu penjelasan mengenai dasardasar pemahaman jaringan syaraf buatan, dasar teknik pengambilan data ciri dari suatu citra, dasar-dasar pemrograman Borland Delphi 6.0 Enterprise. Bab III membahas lebih mendalam mengenai jaringan syaraf buatan yang akan digunakan, metoda akuisisi data serta pengimplementasinya dalam bahasa pemrograman. Bab IV memaparkan hasil analisa dari simulasi yang dilakukan disertai dengan berbagai parameter yang digunakan sebagai bahan pertimbangan. Bab V merupakan bab penutup yang merupakan kesimpulan dari pembahasan bab-bab sebelumnya disertai dengan saran-saran.
Bab II Landasan Teori 2.1.
Unsur-unsur Mendasar Pengolahan Citra Aspek pembahasan utama dari penulisan ini adalah pengambilan data ciri
yang spesifik dari suatu citra. Tentunya pembahasan selanjutnya tidak akan terlepas dari hal-hal yang mendasar dari pengolahan citra. Berikut ini akan dibahas mengenai beberapa hal mendasar mengenai pengolahan citra yang akan membekali pembahasan-pembahasan selanjutnya. 2.1.1. Pengertian Citra Secara umum dan sederhana, citra dapat didefinisikan sebagai representasi visual dari suatu objek. Lebih jauh citra juga dapat diartikan sebagai gambaran yang representatif mengenai suatu objek sedemikian sehingga citra tersebut dapat memberikan kesan yang mendalam mengenai objek yang dimaksud. Jika ingin mendefinisikannya lebih bebas lagi, citra dapat didefinisikan sebagai bentuk visual yang dapat diterima secara baik oleh indera penglihatan, apapun bentuknya. Contoh dari bentuk representasi citra secara nyata dalam kehidupan sehari-hari misalnya foto, lukisan, tulisan bahkan benda-benda tiga dimensi tidak terlepas dari eksistensi citra itu sendiri. Tentunya pengertian-pengertian tadi dapat berkembang sesuai dengan konteks pembicaraan dan ruang lingkup pembahasan. Hal ini dapat dimisalkan bahwa dalam bidang komputer, citra atau disebut juga image merupakan representasi visual dari suatu objek setelah mengalami berbagai transformasi data dari berbagai bentuk rangkaian numerik. 2.1.2. Citra atau Image pada Komputer Komputer memiliki cara pandang tersendiri terhadap suatu citra. Berbeda dengan citra konvensional yang misalnya dengan melalui proses fotografis seperti pada foto dapat dihasilkan suatu citra nyata yang langsung dapat dinikmati oleh indera penglihatan, citra pada komputer harus melalui beberapa tahapan yang cukup rumit. Tahapan-tahapan tersebut dapat digambarkan sebagai suatu 4
5 rangkaian proses dari proses akuisisi data, manipulasi data, visualisasi data, serta proses penyimpanan data. Proses-proses tersebut dapat dijelaskan secara singkat sebagai berikut : 1. Proses akuisisi data Proses akusisi data citra pada komputer bisa dilakukan dengan dua cara, yaitu proses generasi data dan proses perekaman data. Untuk menggenerasi suatu data citra pada komputer, dapat digunakan tools-tools image proccessing yang sudah tersedia dalam bentuk aplikasi komputer seperti PaintBrush, Adobe PhotoShop, CorelDraw, dll. Dengan aplikasiaplikasi tersebut dapat dihasilkan suatu citra yang dapat dibuat sendiri. Sedangkan proses perekaman data pada dasarnya dapat digunakan dengan menggunakan suatu perangkat keras khusus yaitu Scanner. Dengan peralatan tersebut dapat direkam data visual dalam bentuk apapun (2D/3D tergantung model dan jenis scanner yang digunakan) menjadi suatu citra komputer. 2. Proses manipulasi data Setelah proses akuisisi data selesai, pada dasarnya citra tersebut sudah dapat ditampilkan dalam media output standar dari komputer yaitu monitor. Namun biasanya setelah proses akusisi data, citra yang didapat seringkali tidak 100% mirip dengan aslinya, untuk itu diperlukan beberapa proses manipulasi data agar citra tersebut dapat semirip mungkin dengan aslinya. Pada dasarnya proses manipulasi data yang terjadi adalah berupa perbaikan kualitas citra. Secara spesifik dapat berupa pengaturan pencahayaan (Brightness/Saturation), keseimbangan warna (Color Balance), dll. 3. Proses visualisasi data Proses visualisasi data adalah proses yang tidak kalah pentingnya dari proses lain, karena inilah inti maksud dari citra pada komputer tadi. Citra pada komputer divisualisasikan pada suatu device standar input output yaitu monitor, tentunya ini bukan media satu-satunya, bisa juga dicetak melalui printer. 4. Proses penyimpanan data Proses penyimpanan data adalah bagian paling pelik dari pengolahan citra pada komputer. Saat ini sudah terdapat banyak metode yang dapat
6 digunakan untuk menyimpan suatu citra digital ke dalam suatu file. File adalah media penyimpanan standar pada sistem komputer. Metode-metode penyimpanan tadi tentunya memiliki perbedaan yang cukup berarti antara satu dengan yang lainnya. Hal yang paling membedakan biasanya adalah tingkat kompresi data yang ditawarkan oleh masing-masing metode. Beberapa metode yang sudah cukup dikenal adalah BMP, JPEG, PCX, WMF, TIFF, dll. Tetapi pada dasarnya semua citra pada komputer dapat digolongkan atau setidak-tidaknya dapat direpresentasikan ke dalam bentuk bitmap. Citra digital pada komputer memiliki faktor-faktor signifikan yang kemudian menentukan tingkat kualitas dari citra tersebut. Faktor-faktor tersebut antara lain : tingkat kedalaman warna, densitas pixel, tingkat ketajaman, dll. Berdasarkan tingkat kedalaman warnanya, citra digital dapat dibedakan menjadi beberapa jenis yaitu : 1. Citra Biner
: hanya terdiri atas dua warna, biasanya hitam dan putih.
2. Citra Abu
: hanya terdiri dari kombinasi warna antara hitam dan putih.
3. Citra RGB
: terdiri dari warna-warna hasil kombinasi warna merah (Red), hijau (Green) dan biru (Blue).
4. Citra CMYK
: terdiri dari warna-warna hasil kombinasi warna sian (Cyan), magenta (M), kuning (Yellow) dan hitam (blacK).
a b Gambar 2.1. a. Contoh citra biner; b. Contoh citra Abu
7 Seperti telah disebutkan sebelumnya bahwa citra pada komputer pada dasarnya
semuanya
dapat
digolongkan
atau
setidak-tidaknya
dapat
direpresentasikan ke dalam bentuk bitmap. Lalu apakah bitmap itu? Bitmap adalah bentuk pemetaan titik-titik warna yang disebut pixel ke dalam bentuk bitbit numerik yang dikenali oleh komputer. Sebelum membahas lebih jauh mengenai bitmap, ada baiknya dibahas terlebih dahulu apa sebenarnya yang dimaksud dengan pixel. Pixel adalah bagian terkecil dari suatu titik pada layar monitor yang dapat diwakili oleh suatu data. Titik tersebut memiliki atribut absolut yaitu koordinat yang menunjukkan posisinya pada layar monitor. Titik tersebut juga dapat memiliki bobot yang biasanya menunjukkan warna dari titik tersebut. Titik tersebutlah yang dinamakan pixel. Tentunya pengertian pixelpun dapat berkembang sesuai dengan ruang lingkup pembahasan serta konteks pembicaraan yang ada karena pixel hanyalah berupa konsep. Dengan demikian bitmap dapat juga diartikan sebagai kumpulan dari sejumlah pixel dengan konfigurasi posisi dan warna tertentu sehingga membentuk suatu citra digital.
2.2.
Konsep Dasar Jaringan Syaraf Buatan Artificial Intelligent (AI) atau kecerdasan buatan menurut definisi
ensiklopedia populer adalah sebuah bidang ilmu pengetahuan dan teknis yang berhubungan dengan pengertian komputasi terhadap suatu yang biasa disebut tingkah laku kecerdasan manusia, dan penciptaan benda yang dapat menunjukkan kelakuan yang demikian [1]. Tingkat keberhasilan dari suatu sistem kecerdasan buatan sama banyaknya dengan tingkat kegagalan yang terjadi. Hal ini mungkin saja disebabkan oleh terlalu tingginya target dari keberhasilannya. Namun akhir-akhir ini keadaan sudah berubah dengan cukup signifikan dimana tingkat kesuksesan cukup mendominasi. Tingkat kesuksesan yang dicapai tersebut dikarenakan tujuan dari keberhasilannya bersifat terbatas dan lebih terfokus. Sistem jaringan syaraf buatan (JSB) adalah salah satu komponen sistem kecerdasan buatan yang sangat penting. Adapun hal-hal yang mendasari ide dari
8 konsep jaringan syaraf buatan ini tak lain dan tak bukan adalah sistem kerja otak manusia. Pada otak manusia terdapat sel-sel istimewa yang tidak akan mati sebelum pemiliknya mati, sel-sel tersebut seringkali disebut sebagai neuron. Berdasarkan perkiraan kasar, setiap manusia pada umumnya memiliki kurang lebih 109 neuron pada otaknya, dan terdapat 100 jenis neuron yang sudah teridentifikasi. Neuron-neuron ini terbagi atas kelompok-kelompok (yang disebut jaringan) yang dibedakan atas fungsinya, dimana setiap kelompok mengandung ribuan neuron yang saling berhubungan [2]. Dengan demikian dapat disimpulkan bahwa otak merupakan kumpulan dari jaringan-jaringan neuron. Kecepatan proses setiap jaringan ini sebenarnya jauh lebih kecil dibandingkan dengan kecepatan proses komputer yang ada pada saat ini. Namun karena otak terdiri atas jutaan jaringan yang bekerja secara paralel (simultan), maka otak dapat mengerjakan pekerjaan yang jauh lebih kompleks dibanding dengan apa yang dapat dikerjakan oleh komputer yang semata-mata hanya mengandalkan kecepatan. Struktur pemrosesan paralel ini merupakan bagian lain yang menarik dari jaringan neural, yang juga dapat ditiru untuk diimplementasikan pada komputer [1]. Untuk lebih memahami mengenai hubungan antar neuron pada otak dapat diamati bagian-bagian yang ditunjukkan pada Gambar 2.2. sebagai berikut : Dendrit
: saluran masukan bagi neuron
Nucleus
: inti dari suatu neuron
Axon
: saluran keluaran dari neuron
Synapsis
: pengatur kekuatan hubungan antar neuron Synapsis
Nucleus Axon
Neuron_2
Neuron_1 Dendrit Gambar 2.2. Hubungan antar neuron biologis
Proses kerjanya adalah sebagai berikut, dendrit menerima sinyal dari syaraf-syaraf tubuh manusia, misalnya dari syaraf pada retina mata, syaraf telinga,
9 syaraf di bawah kulit, dll. Selain itu dendrit juga membawa sinyal dari neuron lainnya. Jika sinyal berasal dari neuron lain, maka sinyal masukan tersebut akan dirubah kekuatannya oleh synapsis. Akumulasi sinyal yang masuk ke dalam suatu neuron akan diolah untuk menghasilkan sinyal keluaran, dimana sinyal keluaran ini disalurkan melalui axon ke neuron lain menuju otot. Jika sinyal keluaran akhir dialirkan ke otot, maka sinyal masukkan tadi akan menghasilkan reaksi berupa gerakan. Proses belajar yang berlangsung terus menerus akan membentuk kombinasi nilai-nilai penguatan synapsis dari neuron-neuron, dimana pada kombinasi nilai itu akan tersimpan apa yang disebut dengan pengetahuan (knowledge) [1]. Jaringan syaraf buatan berawal dari konsep bahwa otak manusia memproses data dengan cara yang sama sekali berbeda dari komputer biasa. Otak manusia merupakan komputer yang sangat rumit, non linier dan paralel. Otak manusia memiliki kemampuan untuk mengatur struktur unsur-unsur pokoknya yang disebut sebagai neuron, untuk melaksanakan pemrosesan tertentu (contohnya pengenalan pola, persepsi, dan kontrol penggerak) beberapa kali lebih cepat dibandingkan dengan komputer digital tercepat yang ada pada saat ini [3]. Otak manusia memiliki struktur yang hebat serta kemampuan untuk mengembangkan aturan-aturannya sendiri melalui yang dikenal sebagai ‘pengalaman’. Neuron yang sedang ‘berkembang’ dapat diibaratkan sebagai otak plastik, dimana kekenyalan plastik membuat perkembangan sistem syaraf beradaptasi dengan lingkungan sekelilingnya. Kekenyalan terlihat sangat penting untuk neuron sebagai unit pemrosesan informasi dalam otak manusia, juga sama pentingnya dalam jaringan syaraf buatan yang terbentuk dari neuron buatan. Dalam arti secara umum, jaringan syaraf merupakan mesin yang dirancang untuk meniru cara otak melaksanakan suatu tugas atau fungsi tertentu yang diinginkan; jaringan
tersebut
dihasilkan
dengan
menggunakan
komponen-komponen
elektronik atau ditirukan dengan software dalam komputer digital. Jaringan syaraf merupakan prosesor yang terdistribusi luas secara paralel yang terdiri dari unit-unit pemrosesan sederhana, yang memiliki kecenderungan
10 alami
untuk
menyimpan
pengetahuan
berdasarkan
pengalaman
dan
memungkinkan untuk dapat digunakan. Hal ini menyerupai otak dalam dua hal : 1. pengetahuan yang didapat oleh jaringan tersebut berasal dari lingkungannya melalui proses belajar; 2. kekuatan hubungan antara neuron, yang diketahui sebagai bobot sinapsis, digunakan untuk menyimpan pengetahuan yang didapatkan. 2.2.1. Konfigurasi Jaringan Syaraf Buatan Menurut strukturnya, jaringan syaraf buatan dapat dibagi ke dalam 2 jenis yaitu [4] : 1. FeedForward nets. Dalam konfigurasi FeedForward sinyal mengalir searah dari lapisan masukan atau dengan kata lain proses pengolahan data berlangsung pada satu arah yaitu maju, lapisan tersembunyi sampai lapisan keluaran. Setiap simpul dihubungkan dengan simpul yang berada pada lapisan yang sama. Contoh : Multilayer perceptron (MLP) [Rumelhart dan McClelland, 1986], Learning Vector Perceptron (LVQ) network [Kohonen, 1989], Cerebellar Model Articulation Control (CMAC) network [Albus, 1975], Group Method of Data Handling (GMDH) network [Hecht-Nielsen, 1990].
...
...
...
... input
hidden output Gambar 2.3. FeedFordward Network
11 2. Recurrent nets. Sinyal mengalir ke dua arah : maju dan mundur. Recurrent network memiliki memori dinamik, dimana keluaran-keluaran yang berasal dari masukan, sama baiknya seperti masukan dan keluaran sebelumnya. Contoh : Hopfield network [Hopfield, 1982], Elman network [Elman, 1990], dan Jordan network [Jordan, 1986]. y1
y2
output y3
w12
Lapisan Hopfield
x1
yn
w13
......................................
x2
x3 input Gambar 2.4. Recurrent Network
w1n
xn
2.2.2. Propagasi Balik (Back Propagation) Propagasi balik merupakan salah satu proses belajar jaringan syaraf buatan dimana dalam proses belajar tersebut pengubahan nilai berlangsung pada arah mundur, yaitu mulai dari lapisan output dan berakhir di lapisan input. Algoritma belajar propagasi balik adalah sebagai berikut [5] : 1. Perhitungan nilai keluaran neuron pada lapisan tersembunyi dan output.
neti wij s j qi N
j 1
si f neti dimana, i
= nomor neuron yang sedang dihitung sinyal aktivasinya.
j
= nomor neuron yang outputnya dikontribusikan pada neuron i
sj
= nilai output neuron j
wij
= nilai bobot hubungan antara neuron ke i dan ke j
qi
= nilai bias neuron ke i
12 fungsi neti atau f(neti) disebut juga sebagai fungsi aktivasi yang bentuknya dapat bermacam-macam. 2. Perhitungan kesalahan dalam proses belajar disebut dengan fungsi energi. E
y x, y
x i
six
2
i
dimana, yi si
x
= output target neuron output i = output aktual neuron output I pada saat jaringan terhubung dengan sample x
3. Perhitungan sensitivitas (δi) neuron-neuron dalam lapisan tersembunyi dan lapisan output. Dimana persamaan yang digunakan untuk perhitungan sensitivitas baik untuk lapisan tersembunyi maupun lapisan output, tergantung dari fungsi aktivasi yang digunakan. 4. Perhitungan nilai perubahan bobot dan bias.
perubahan bobot
perubahan bias
: wij x, y i s xj : qi x, y i
5. Perhitungan nilai bobot dan bias baru.
bobot baru
: wijt 1 wijt wijt momentum wijt 1
bias baru
: qit 1 qit qit
6. Langkah-langkah tersebut diulang sampai deviasi keluaran kecil sehingga mencapai stopping kriteria error yang diharapkan.
2.2.3. Fungsi Aktivasi. Pada dasarnya semua bentuk fungsi matematis dapat dijadikan sebagai fungsi aktivasi, dengan syarat bahwa fungsi tersebut bersifat diferensiabel atau dapat diturunkan. Fungsi aktivasi dapat diibaratkan sebagai pendefinisian penguatan non linier dalam sistem analog (continue). Penguatan (gain) ini dihitung dengan mencari rasio perubahan pada fungsi output neuron pada lapisan tersembunyi dan lapisan keluaran, dimana penguatan merupakan kemiringan kurva pada suatu tingkat eksistensi tertentu, dan nilainya berubah dari harga yang kecil pada
13 eksitasi negatif yang besar (kurvanya hampir mendatar) menjadi harga yang besar pada eksitasi nol, dan nilainya kembali mengecil seiring dengan eksitasi yang semakin besar dan positif. Fungsi aktivasi tidak hanya digunakan pada saat perhitungan nilai keluaran neuron saja (neuron pada lapisan tersembunyi dan lapisan output), tetapi turunan pertamanya digunakan juga untuk menghitung perubahan bobot dan bias pada proses belajar. Berikut ini beberapa fungsi matematis yang umum digunakan sebagai fungsi aktivasi. 1. Fungsi Sigmoid Fungsi sigmoid dikenal juga dengan fungsi logistik. Bentuk umumnya :
f sigmoid x
1 1 e x Fungsi sigmoid memiliki grafik berbentuk huruf S, seperti terlihat pada Gambar 2.6. 1.2 1 0.8 0.6 0.4 0.2 0
Gambar 2.5. Grafik fungsi Sigmoid
2. Fungsi Tangen Hiperbolik Fungsi ini merupakan fungsi yang sering digunakan oleh para ahli biologi sebagai model matematika aktivasi sel syaraf. Fungsi Tangen Hiperbolik memiliki bentuk grafik yang sama dengan fungsi logistik yaitu berbentuk huruf S, namun simetris terhadap titik pusat (origin) seperti terlihat pada Gambar 2.7. Bentuk umumnya : fTangenHiperbolik x tanhx
14 1.5 1 0.5 0 -0.5 -1 -1.5
Gambar 2.6. Grafik fungsi Tangen Hiperbolik
3. Fungsi Frank Bentuk umum dari fungsi ini ;
f frank x
1 1 1 2 1 x 2
1.2 1 0.8 0.6 0.4 0.2 0
Gambar 2.7. Grafik fungsi Frank
Beberapa fungsi diferensiabel lainnya yang dapat digunakan sebagai fungsi aktivasi jaringan syaraf membutuhkan beberapa percobaan terlebih dahulu untuk membuktikan tingkat efektifitasnya. 2.2.4. Metode Output Parameter penting lainnya dari JSB adalah bagaimana output dari JSB tersebut direpresentasikan, secara terlokalisasi atau terdistribusi. Sebelum membahas lebih jauh mengenai masalah ini, istilah ‘representasi’ harus lebih diperjelas. Misalkan bilangan-bilangan dari ‘0’ sampai dengan ‘10’ akan ‘direpresentasikan’ dalam bentuk pola-pola biner. Hal ini dapat dilakukan dengan pengkodean 4 digit biner secara biasa, dimana ‘0000’ merepresentasikan bilangan ‘0’, ‘0001’ mewakili bilangan ‘1’, ..., ‘0101’ merepresentasikan bilangan ‘5’, dan seterusnya. Cara ini disebut sebagai representasi terdistribusi karena angka ‘1’
15 dalam pola tersebut dapat muncul pada semua posisi biner tergantung dari kode yang terpilih. Cara kedua adalah 10 digit biner digunakan untuk menggambarkan bilangan-bilangan yang sama dengan cara menempatkan angka ‘1’ pada baris posisi ke-n misalnya dari sebelah kiri untuk bilangan ke-n. Dengan demikian ‘0’ direpresentasikan sebagai ‘0000000000’, bilangan ‘1’ direpresentasikan sebagai ‘1000000000’, ..., bilangan ‘5’ dengan ‘0000100000’, dan seterusnya. Cara ini disebut
sebagai
representasi
terlokalisasi
karena
teknik
pengkodeannya
menggunakan lokasi dari ‘1’ untuk merepresentasikan data [6]. Tabel 2.1. Contoh representasi output Kode Output Bilangan Terlokalisasi Terdistribusi 0 0000000000 0000 1 1000000000 0001 2 0100000000 0010 3 0010000000 0011 4 0001000000 0100 5 0000100000 0101 6 0000010000 0110 7 0000001000 0111 8 0000000100 1000 9 0000000010 1001 10 0000000001 1010
Dari Tabel 2.1. dapat diamati kelebihan maupun kelemahan dari kedua metode tadi. Representasi terlokalisasi memiliki kecenderungan penganalisaan gradasi kebenaran terhadap beberapa jenis output, sedangkan kelemahannya adalah diperlukannya neuron output pada JSB sebanyak jumlah variasi output yang berbeda. Dengan menggunakan representasi output terdistribusi, nilai kebenaran dari output hanya dapat diamati untuk satu jenis output saja, kelebihannya adalah bahwa jumlah neuron output yang digunkaan jauh lebih sedikit sehingga lebih efektif. Dalam penulisan ini akan digunakan metode output yang direpresentasikan secara terdistribusi. Hal ini dikarenakan banyaknya jumlah variasi output yang harus direpresentasikan, sehingga tidaklah efektif bila direpresentasikan dengan jumlah digit sebanyak variasi output yang berbeda. Perlu diketahui, seperti yang telah disebutkan pada bagian batasan masalah, bahwa citra yang akan dicoba
16 untuk dikenali adalah citra huruf-huruf alpabet (huruf kecil maupun huruf kapital) berikut angka-angka arab satuan, yang berarti ada sejumlah 62 (13 huruf kecil+13 huruf besar+10 angka arab satuan) objek yang harus direpresentasikan sebagai target output. Tentunya sangatlah tidak efektif bila 62 objek tersebut direpresentasikan dengan sejumlah 62 digit biner output. Oleh karenanya, sebagai solusi dari permasalahan tersebut diatas, penulis akan menggunakan metode output terdistribusi. Setiap huruf alpabet dan angka arab akan dikonversi ke dalam bentuk pengkodean 6 bit. Berarti hanya diperlukan 6 neuron yang akan digunakan sebagai output pada lapisan output JSB. Tetapi dengan pengkodean 6 bit berarti tersedia 26 = 64 variasi output yag berbeda, sedangkan simbol atau objek yang akan direpresentasikan hanya ada 62 objek, untuk itu penulis menambahkan dua objek tambahan untuk melengkapi ketersediaan pengkodean, kedua objek tersebut adalah ‘>’ dan ‘?’. Daftar pengkodean 64 objek tersebut selengkapnya dapat dilihat pada Lampiran A.
2.3.
Dasar-dasar Pemrograman Borland Delphi 6.0 Enterprise Program simulasi Jaringan Syaraf Buatan untuk mengenali pola karakter
pada penulisan ini menggunakan bahasa Pemrograman Borland Delphi 6.0 Enterprise. Untuk itu diperlukan pemahaman yang sangat mendasar untuk mengawali
algoritma-algoritma
rumit
dalam
proses
komputasi
maupun
manipulasi program itu sendiri secara logis. Borland Delphi 6.0 Enterprise (selanjutnya akan disebut Delphi) adalah suatu bahasa pemrograman visual yang memiliki berbagai fasilitas pemrograman yang cukup memadai. Dengan menggunakan Delphi, pertama kali aplikasi yang akan dibuat harus dibuat terlebih dahulu tampilan utamanya, baru kemudian dapat ditambahkan logika-logika program dengan menuliskan kode-kode program. Selanjutnya langkah-langkah tersebut dapat saling mengisi. Konsep pemrograman yang ditawarkan oleh Delphi tergolong cukup mudah, bahkan bagi orang awam sekalipun. Hal ini dimungkinkan dikarenakan Delphi termasuk bahasa pemrograman yang berorientasi objek dimana setiap permasalahan akan diwakilkan menjadi objek-objek sederhana, yang kemudian dapat saling terhubung dan terkait satu sama lain sehingga menjadi suatu objek
17 yang lebih rumit. Untuk lebih dapat memahaminya, berikut uraian singkat mengenai Delphi. 2.3.1. Lingkungan Pengembangan Terintegrasi Ketika Delphi dijalankan, secara langsung akan berada pada suatu lingkungan pengembangan
terintegrasi
(IDE
=
Integrated
Development
Environment). Lingkungan ini menyediakan semua perlengkapan yang diperlukan untuk merancang, mengembangkan, mengujicoba, mendebug dan men-deploy aplikasi-aplikasi yang dibuat. Dalam lingkungan yang terintegrasi ini sudah tercakup didalamnya suatu Visual Form Designer, Object Inspector, Object TreeView, Component Palette, Project Manager, Source Code Editor serta
debugger di antara perlengkapan-perlengkapan lainnya yang tidak kalah pentingnya. Berikut bagian-bagian utama dari IDE tersebut. 1. Main Menu Bagian ini menyediakan fasilitas menu utama, icon-icon ToolBar serta Component Palette. TittleBar
MenuBar
ToolBar
Component Palette
Gambar 2.8. Tampilan Main Menu
2. Object Inspector Bagian ini menyajikan informasi mengenai properti-properti yang berhubungan dengan objek yang sedang aktif. Pada bagian ini juga dapat diatur nilai dari masing-masing properti tersebut. Selain itu dapat diatur juga Event Handler untuk setiap objek yang sedang aktif.
18
Object List Event Handler Properties Editor
Gambar 2.9. Tampilan Object Inpector
3. Visual Form Designer Bagian ini digunakan untuk menaruh objek-objek yang akan digunakan pada aplikasi. Semua objek visual harus diletakkan di dalam form ini. Pada form ini dapat diatur posisi, ukuran maupun bagaimana suatu objek akan ditampilkan. TitleBar
Client Area
Gambar 2.10. Tampilan Visual Form Designer
19 4. Source Code Editor Setelah proses desain tampilan mendasar selesai, maka berikutnya adalah melakukan proses coding, yang merupakan inti dari pemrograman. Untuk menuliskan kode-kode program, Delphi telah menyediakan tempat khusus yang diberi nama Source Code Editor.
Gambar 2.11. Tampilan Source Code Editor
2.3.2. Komponen-Komponen Delphi Komponen adalah objek-objek yang dapat diletakkan pada suatu form atau suatu modul data yang kemudian dapat dimanipulasi pada saat proses perancangan. Komponen merupakan subset dari semua objek yang ada. Komponen-komponen yang akan diletakkan pada form berada pada bagian Component Palette. Properti-propertinya dapat diatur dengan atau tanpa
menuliskan kode. Untuk mengubah properti dari suatu komponen tanpa menuliskan kodenya, dapat digunakan Object Inspector, sementara untuk kode dapat ditulis pada bagian Source Code Editor. Secara umum komponen-komponen pada Delphi dapat dibedakan menjadi dua yaitu komponen-komponen visual (VCL = Visual Component Library) dan komponen-komponen non visual. Komponen-komponen visual maksudnya bahwa komponen-komponen tersebut nampak baik pada saat perancangan maupun pada
20 saat runtime, sebaliknya komponen-komponen non visual hanya dapat terlihat pada saat perancangan saja. Berikut beberapa komponen visual yang digunakan pada aplikasi untuk penulisan ini : 1. TDrawGrid
: digunakan untuk menampilkan suatu informasi dengan format kolom dan baris.
2. TEdit
: digunakan untuk menginput data.
3. TGauge
: digunakan untuk menampilkan ProgressBar.
4. TGroupBox
: mirip dengan TPanel dengan tambahan TitleBar dan tampilan yang sedikit berbeda.
5. TLabel
: berfungsi untuk menampilkan text.
6. TLabeledEdit
: gabungan antara TLabel dan TEdit.
7. TPanel
: digunakan
untuk
mengelompokkan
beberapa
komponen lain. 8. TSpeedButton
: digunakan untuk menjalankan rutin tertentu atau untuk mengatur suatu mode.
9. TSpinEdit
: digunakan untuk memilih suatu nilai numerik pada suatu jangkauan tertentu.
10. TStatusBar
: digunakan untuk menampilkan StatusBar.
11. TStringGrid
: digunakan untuk menampilkan informasi berupa string dalam format kolom dan baris.
12. TToolBar
: digunakan untuk menampilkan menu dan toolbar.
Berikut beberapa komponen non visual yang digunakan pada aplikasi untuk penulisan ini : 1. TImageList
: digunakan untuk menampung icon-icon yang akan ditampilkan pada suatu tombol.
2. TMainMenu
: digunakan untuk mengatur tampilan menu utama.
3. TOpenDialog
: digunakan untuk menampilkan dialog masukan file.
4. TPopupMenu
: digunakan untuk mengatur menu konteks.
5. TSaveDialog
: digunakan untuk menampilkan dialog menyimpan file.
21 2.3.3. Struktur Pemrograman Sebagai bahasa pemrograman populer tentunya seperti hampir setiap bahasa pemrograman lainnya, Delphi memiliki struktur pemrograman yang unik dan ekstensibel. Pada dasarnya struktur bahasa pemrograman yang dimiliki oleh setiap bahasa pemrograman digunakan untuk mengontrol logika atau algoritma dari aplikasi yang akan dibuat. Untuk itu biasanya setiap bahasa pemrograman yang baik menyediakan berbagai struktur pemrograman berikut dengan berbagai variasinya yang mungkin saja dibutuhkan oleh seorang programmer untuk mewujudkan aplikasi yang akan dibuatnya. Bila dilihat dari fungsinya sebagai pengontrol logika, secara umum struktur pemrograman dalam suatu bahasa pemrograman dapat digolongkan menjadi dua yaitu perulangan dan percabangan. Tentunya keduanya tidaklah mewakili sepenuhnya struktur pemrograman yang dimiliki oleh Delphi, karena masih ada unit, procedure, function, dan lain sebagainya. 2.3.3.1. Struktur Perulangan Struktur perulangan digunakan untuk melakukan iterasi satu atau beberapa perintah sampai batas iterasi terpenuhi. Struktur perulangan ini dapat dibedakan menjadi dua jenis yaitu struktur perulangan bersyarat dan struktur perulangan tidak bersyarat. Berikut beberapa contoh perulangan tersebut : 1. Perintah For Merupakan perulangan tidak bersyarat, artinya jumlah iterasi tidak ditentukan oleh terpenuhinya suatu kondisi tertentu melainkan didefinisikan secara eksplisit pada strukturnya. Berikut bentuk umum dari perulangan ini : for counter := initialValue to finalValue do statement
atau for counter := initialValue downto finalValue do statement
dimana, counter
adalah variabel lokal (dideklarasikan didalam blok rutin yang berisi perintah For) yang bertipe ordinal, tanpa pembobot
initialValue
dan
22 finalValue
adalah ekspresi-ekspresi yang menunjukkan jumlah perulangan.
statement
adalah
sekumpulan
perintah
sederhana
maupun
terstruktur yang tidak mengubah nilai dari counter. 2. Perintah While Melakukan perulangan terhadap sejumlah perintah selama kondisi yang diberikan bernilai benar. Perlu diketahui bahwa pengecekan kondisi dilakukan diawal perulangan. Berikut bentuk umum dari perulangan ini : while expression do statement
dimana expression mengembalikan suatu nilai Boolean (benar atau salah) dan statement dapat berupa rangkaian perintah. 3. Perintah Repeat Melakukan perulangan terhadap sejumlah perintah sampai kondisi yang diberikan bernilai benar. Perintah ini memeriksa kondisi di akhir setiap perulangan. Berikut bentuk umum dari perintah ini : repeat statement1;...;statementn; until expression
dimana expression mengembalikan suatu nilai Boolean. Setiap blok perintah akan dijalankan minimal satu kali, dikarenakan posisi pengecekan kondisinya yang di akhir dari setiap perulangan. 2.3.3.2. Struktur Percabangan Struktur percabangan digunakan untuk mengelompokkan sejumlah perintah berdasarkan kondisi tertentu. Berikut beberapa contoh percabangan : 1. Perintah If Secara umum ada dua bentuk blok perintah if; yaitu if ... then dan if ... then ... else. Bentuk umum dari if ... then adalah if expression then statement
dimana expression mengembalikan suatu nilai Boolean. Jika expression bernilai benar maka statement akan dijalankan, sebaliknya tidak. Bentuk umum dari if ... then ... else adalah if expression then statement1 else statement2
23 dimana expression mengembalikan suatu nilai Boolean. Jika expression bernilai benar maka statement1 akan dijalankan, sebaliknya statement2 yang akan dijalankan. 2. Perintah Case Perintah ini memberikan alternatif yang lebih baik untuk pemilihan kondisi yang lebih rumit jika dibandingkan dengan perintah if. Perintah ini memiliki bentuk umum sebagai berikut : case selectorExpression of caseList1: statement1; ... caseListn: statement; end
dimana selectorExpression adalah semua ekspresi bertipe ordinal (kecuali String) dan setiap caseList adalah salah satu dari yang berikut :
suatu bilangan numerik, konstanta terdeklarasi, ataupun ekspresi lainnya yang dapat dievaluasi oleh kompiler tanpa harus menjalankan program. Juga
harus
bertipe
selectorExpression.Tidak
ordinal
yang
kompatibel
dengan
boleh berupa prosedur maupun fungsi.
suatu subrange yang memiliki bentuk First .. Last, dimana keduanya memenuhi kriteria bahwa First harus lebih kecil atau sama dengan Last.
suatu daftar yang memiliki bentuk item1, ..., itemn dimana setiap item
memenuhi salah satu kriteria di atas.
Bab III Implementasi Konsep 3.1.
Analisa Permasalahan Suatu citra huruf atau angka (selanjutnya akan disebut sampel) yang akan
diidentifikasi menggunakan JSB, haruslah melalui tahapan-tahapan tertentu terlebih dahulu sehingga dapat menjadi input yang baik bagi JSB. Adapun input yang dapat diterima oleh dengan baik oleh JSB adalah berupa kumpulan data numerik. Dengan demikian maka permasalahan pertama adalah bagaimana mengkonversi suatu citra digital menjadi kumpulan data numerik yang representatif dan konsisten. Tentunya walaupun JSB yang digunakan memiliki karakteristik, struktur ataupun konfigurasi yang sudah cukup spesifik, masih ada parameter-parameter penting lain dari JSB tersebut yang harus diatur untuk mendapatkan hasil terbaik. Parameter-parameter tersebut antara lain adalah pengaruh bias dan bobot awal, nilai momentum, nilai LearnRates, nilai stopping criteria error, epoch, dan lain sebagainya. Penyesuaian terhadap nilai-nilai tersebut adalah masalah berikutnya yang akan dianalisa. Karakteristik jaringan sama halnya seperti sifat yang menggambarkan bagaimana tingkah laku jaringan ketika menghasilkan output dari input yang dimasukkan kedalamnya sesuai dengan fungsi aktivasi dan parameter-parameter yang digunakan oleh JSB. Oleh karenanya semakin banyak diketahui karakteristik JSB dengan menggunakan parameter yang berbeda-beda tentu akan memudahkan pada saat penerapannya, sebab dapat disesuaikan antara permasalahan yang dihadapi dengan karakteristik jaringan untuk menyelesaikan permasalahan, sehingga kemungkinan gagal dapat diperkecil.
3.2.
Metode Akuisisi Data Setiap sampel yang akan diamati dan dianalisa oleh JSB harus
direpresentasikan secara baik ke dalam bentuk data numerik. Untuk itu diperlukan suatu metode yang dapat mengekstraksi data ciri dari setiap sampel tadi secara konsisten. Tentunya data numerik yang dihasilkan haruslah benar-benar dapat mewakili karakteristik atau ciri-ciri dari sampel yang diamati, sehingga 24
25 diharapkan dari sekumpulan data dengan target yang sama akan dihasilkan suatu generalisasi atau pencirian secara umum terhadap suatu target yang sejenis. Proses akuisisi data tersebut harus benar-benar akurat dengan mempertimbangkan semua karakteristik dari setiap sampel yang tidak lain adalah suatu citra digital, dimana setiap citra digital memiliki karakteristik tertentu. 3.2.1. Karakteristik Sampel Sampel-sampel yang akan diamati tentunya harus dibatasi dengan suatu struktur dimensi dan homogenisasi pixel yang sederhana, sehingga diharapkan dapat mempermudah proses analisa terhadap konsep ini. Setiap sampel adalah satu citra digital yang nilai warna dari pixel-pixelnya terhomogenisasi menjadi dua representasi warna, yaitu warna aktif (hitam) dan warna nonaktif (selain hitam). Selain itu dimensi dari setiap sampel dibatasi sebesar area yang disediakan pada program aplikasi, tetapi tidak akan mengurangi fleksibilitas dan skalabilitas yang diharapkan. Pembatasan-pembatasan tersebut dilakukan agar fokus dari penulisan ini dapat tercapai dengan baik tanpa harus berkutat menganalisa hal-hal yang hanya berupa pendukung saja.
Gambar 3.1. Contoh sampel yang merepresentasikan huruf ‘A’
3.2.2. Ekstraksi Data dari Sampel Untuk mendapatkan data yang akurat dan konsisten dari setiap sampel, penulis menggunakan suatu metode sederhana yaitu dengan cara menghitung jumlah pixel aktif
yang terdapat pada bagian-bagian dari sampel. Adapun
algoritma umum dari pengekstrakan data numerik dari setiap sampel adalah sebagai berikut :
26 1. Setiap sampel yang diamati, dibagi menjadi beberapa area, misalnya 4 kolom dan 5 baris, sehingga akan terdapat 20 area pengamatan; 2. jumlah pixel yang aktif dari setiap area yang ada dihitung secara akurat; 3. dihasilkan sejumlah 20 data numerik dengan atribut kolom dan baris yang diharapkan dapat mewakili data ciri dari sampel yang diamati. Perlu diketahui bahwa setelah melalui tahapan normalisasi, data-data numerik tadi akan menjadi data input pada JSB. Dengan demikian jumlah area yang ada pada setiap sampel akan bersesuaian dengan jumlah neuron input JSB yang akan digunakan. Agar dapat dihasilkan kumpulan data yang seragam, maka setiap sampel yang akan diamati haruslah memiliki jumlah area pembagian yang sama. Berikut contoh pengekstrakan data ciri dari sampel pada Gambar 3.1. 0
22
3
0
0
13
13
0
19
14
23
0
13
0
3
10
13
0
0
9
21
21
21
21
Gambar 3.2. Pembagian region pada sample berikut nilai pixel aktifnya
3.2.3. Normalisasi Data Sampel Tentunya sampel yang dibuat tidak mungkin akan memiliki dimensi yang identik antara yang satu dengan yang lainnya. Hal ini merupakan faktor skalabilitas. Selain itu setiap sampel juga akan memiliki bentuk yang unik, dapatlah dikatakan tidak mungkin ada dua sampel yang bentuknya identik. Hal tersebut merupakan faktor fleksibilitas. Pada penulisan ini penulis mencoba untuk mempertahankan keleluasaan pembuatan sampel dengan cara menjaga faktor skalabilitas dan fleksibilitas tetap tinggi, dengan demikian diharapkan proses pembuatan sampel ini dapat sedekat mungkin menyerupai proses penulisan dengan tangan secara alami.
27 Tetapi untuk menjaga faktor skalabilitas dan fleksibilitas tersebut, data numerik yang dihasilkan pada proses sebelumnya akan menjadi tidak konsisten lagi. Untuk itu diperlukan satu proses tambahan untuk mempertahankan konsistensi data terhadap sampel pengamatan, yaitu bahwa setiap data numerik harus melalui suatu proses normalisasi data. Metode normalisasi yang akan digunakan adalah juga suatu metoda normalisasi yang paling sederhana yaitu normalisasi perbandingan tetap. Dalam kasus ini adalah perbandingan antara jumlah pixel aktif pada masing-masing area dalam suatu sampel akan dibandingkan (dibagi) dengan jumlah pixel aktif terbanyak dalam satu area yang ada pada sampel yang sama. Hasil dari proses normalisasi ini adalah sekumpulan data numerik yang bernilai antara 0 (nol) dan 1 (satu). Pada Gambar 3.2., nilai pixel tertinggi adalah 23, maka untuk menormalisasi sampel tersebut setiap nilai pixel aktif pada setiap region akan dibagi dengan 23. Berikut adalah contoh dari tabel normalisasi terhadap data numerik yang telah dihasilkan pada contoh sebelumnya.
Tabel 3.1. Normalisasi dari contoh Nilai pixel Region Asli Ternormalisasi 1 0 0 2 22 0.9565 3 3 0.1304 4 0 0 5 0 0 6 13 0.5652 7 13 0.5652 8 0 0 9 19 0.8261 10 14 0.6087 11 23 1 12 0 0 13 13 0.5652 14 0 0 15 3 0.1304 16 10 0.4348 17 13 0.5652 18 0 0 19 0 0 20 9 0.3913
28 3.2.4. Akumulasi Data Numerik Setelah setiap data numerik pada masing-masing sampel dinormalisasi, maka kumpulan data tersebut akan diakumulasi ke dalam bentuk tabular. Sehingga akhirnya dapat dengan mudah diimplementasikan ke dalam JSB. Data akhir yang terakumulasi haruslah mencakup semua parameter input yang diperlukan oleh JSB dari setiap sampel pengamatan. Adapun data yang harus ada adalah target output dari setiap sampel serta kumpulan data numerik untuk tiaptiap area pada masing-masing sampel. Contoh data yang sudah berbentuk tabular dapat dilihat pada Lampiran B.
3.3.
Struktur Jaringan Syaraf Buatan Pada penulisan ini JSB hanyalah digunakan sebagai alat untuk
menganalisa serta membuktikan konsep ekstraksi yang dibuat. Oleh karenanya bagian ini tentunya bukanlah materi pembahasan utama. Adapun jaringan syaraf yang digunakan pada penulisan ini memiliki batasan-batasan serta karakteristik tertentu yang disesuaikan secara empiris terhadap kebutuhan. Hal ini menyebabkan sifat dari jaringan syaraf yang digunakan cenderung bersifat rigid atau kaku. Tetapi walaupun demikian pemilihan karakteristik maupun pemberian parameter-parameter yang digunakan merupakan hasil beberapa kali percobaan yang dilakukan secara empiris. Percobaan-percobaan tersebut tidak akan penulis kemukakan secara mendetail dikarenakan percobaan tersebut bukanlah permasalahan utama yang akan dibahas pada penulisan ini. Struktur
JSB
merupakan
kumpulan
neuron-neuron
yang
teratur
sedemikian rupa sehingga membentuk susunan yang memiliki arti. Pada penulisan ini penulis menggunakan struktur JSB sebagaimana terlihat pada Gambar 3.3. Adapun ketentuan jumlah neuron pada tiap-tiap lapisan dapat dilihat pada tabel berikut : Lapisan
Input Hidden Output
Tabel 3.2. Distribusi Neuron Jumlah Neuron
Tergantung jumlah region 10 6
...
29
input
hidden
output
Gambar 3.3. Struktur Jaringan Syaraf Buatan yang digunakan
3.3.1. Penggunaan algoritma Propagasi Balik JSB memiliki berbagai jenis algoritma yang dapat diimplementasikan. Setelah melalui proses studi pustaka dan wawancara dengan beberapa ahli, dapat diperoleh kesimpulan bahwa algoritma terbaik untuk menganalisa suatu pola dengan karakteristik seperti yang dipermasalahkan pada penulisan ini adalah algoritma propagasi balik. Sampai saat ini belum ada alasan yang cukup ilmiah dan logis mengenai kesimpulan
tersebut,
dikarenakan
penarikan
kesimpulannya
dilakukan
berdasarkan pendekatan empiris melalui berbagai percobaan. Dimana dalam berbagai percobaan tersebut telah diperoleh hasil bahwa algoritma propagasi balik memiliki performa akurasi yang cukup baik untuk permasalahan dimaksud. 3.3.2. Penggunaan fungsi aktivasi Sigmoid Alasan yang sama melatarbelakangi penggunaan fungsi aktivasi sigmoid ini. Setelah dilakukan studi pustaka, wawancara dengan para ahli, dan percobaanpercobaan empiris, diperoleh kesimpulan bahwa untuk menganalisa permasalahan pada penulisan ini, fungsi sigmoid memiliki karakteristik serta performa yang paling unggul dibandingkan dengan fungsi aktivasi lainnya.
30 3.3.3. Parameter-parameter penentu Selain struktur, algoritma, serta fungsi aktivasi yang digunakan, masih ada parameter-parameter signifikan lainnya yang sangat mempengaruhi karakteristik JSB secara keseluruhan. Nilai dari parameter-parameter tersebut akan sangat mempengaruhi hasil akhir dari JSB. Adapun parameter-parameter penentu lain tersebut antara lain : 1. Nilai awal Seperti telah disebutkan pada bagian landasan teori bahwa setiap neuron pada JSB memiliki suatu nilai numerik yang dinamakan sebagai bias. Sedangkan nilai numerik yang menghubungkan antara neuron yang satu dengan yang lainnya adalah bobot. Pada saat JSB diinisialisasi, maka semua neuron pada JSB harus diisi dengan nilai acak bertipe real. Nilai acak tersebut digenerasi menggunakan metoda pseudo random tertentu dengan batasan jangkauan. Batasan jangkauan inilah yang sangat mempengaruhi karakteristik JSB. Ada dua jenis jangkauan, yaitu :
Simetris, jangkauan simetris maksudnya bahwa nilai minimum dan maksimum jangkauan memiliki magnitasi yang seimbang terhadap nilai nol. Misalnya : -2 s/d 2.
Asimetris, jangkauan asimetris maksudnya bahwa nilai minimum dan maksimum jangkauan tidak memiliki magnitasi yang seimbang terhadap nilai nol. Misalnya : -2 s/d 0 atau 0 s/d 2 atau -2 s/d 5 Pada penulisan ini digunakan jangkauan nilai awal yang simetris
dengan nilai default -2 s/d 2. 2. LearnRate (Laju Belajar) Nilai laju belajar pada aplikasi yang penulis buat memiliki nilai default 0,2. Nilai laju belajar ini harus lebih besar dari nol. Semakin besar nilai laju belajar maka proses belajar akan semakin ‘cepat’ tetapi JSB akan semakin tidak akurat karena perubahan nilai numerik yang terlalu drastis ada proses perhitungan. Sebaliknya apabila nilai laju belajar ini semakin kecil (mendekati nol), maka proses belajar akan semakin ‘lama’ tetapi JSB akan lebih teliti.
31 3. Momentum Parameter ini berfungsi untuk lebih mempercepat nilai perubahan neuron dengan magnitasi yang sama. Pada aplikasi yang penulis buat (CharCognitron), nilai momentum ini memiliki nilai default 0,5. tidak dapat disimpulkan bagaimana pengaruh nilai momentum ini terhadap hasil proses belajar melainkan dengan melakukan pendekatan empiris melalui percobaanpercobaan. 4. Stopping Criteria Error Parameter ini digunakan sebagai nilai error acuan kapan proses belajar akan dihentikan. Atau dengan kata lain bahwa proses belajar akan dihentikan apabila nilai error yang didapat sudah lebih kecil atau sama dengan nilai parameter ini. Hal ini sangat berguna untuk menghentikan proses belajar pada saat iterasi yang sangat banyak, atau juga sebagai nilai acuan keberhasilan proses belajar. 5. HardTrapping MatchLevel Parameter ini digunakan untuk mengecek apakah JSB yang terbentuk sudah mencapai kondisi optimal atau belum. Kondisi optimal dari sutu JSB dapa diukur secara acuan bahwa apabila JSB tersebut sudah dapat mengenali semua sampel yang sebelumnya ‘diumpankan’ ke dalamnya dengan baik dan 100 % benar, maka JSB tersebut berada pada kondisi optimal.
3.4. Implementasi Konsep Pengenalan Citra Huruf dan Angka pada Program Aplikasi CharCognitron Aplikasi yang penulis buat untuk menunjang analisa terhadap konsep pengenalan citra dan huruf hanyalah bersifat sebagai alat (tool) untuk membuktikan dan mempermudah analisa konsep tersebut. Jadi aplikasi ini juga bukanlah topik pembahasan utama. Secara garis besar topologi aplikasi CharCognitron ini terdiri dari beberapa modul yaitu : 1. Modul Sample Builder Modul ini digunakan untuk membuat, merancang, mengumpulkan dan menyimpan sampel-sampel yang akan digunakan.
32 2. Modul Learning Activity Pada modul inilah proses belajar JSB dilakukan. Pada modul ini juga dapat
ditentukan
nilai-nilai
atau
parameter-parameter
yang
akan
mempengaruhi hasil akhir dari JSB. Modul ini terdiri dari dua sub modul yaitu sub modul Structure dan sub modul Learning. Pada sub modul Structure, terdapat informasi mengenai struktur JSB yang digunakan, berikut tombol-tombol untuk menginisialisasi JSB dengan nilai-nilai acak. Sedangkan pada sub modul Learning, dapat diatur berbagai parameter penentu JSB serta disinilah tempat memulai proses belajar. 3. Modul Testing Activity Setelah proses belajar dilakukan, selanjutnya dapat dilakukan tahap pengujian terhadap JSB yang dihasilkan. Pada modul ini dapat diuji kehandalan JSB tersebut untuk mengenali sampel lain dengan target output yang sama. CharCognitron Modul
Sample Builder
Modul
Learning Activity
Modul
Testing Activity
Gambar 3.4. Topologi CharCognitron
3.4.1. Perancangan Input Output Aplikasi CharCognitron diharapkan dapat mudah digunakan dan sangat mendukung untuk melakukan proses-proses perhitungan numerik yang ada. Untuk itu diperlukan suatu perancangan tampilan serta alur proses yang baik. Berikut ini gambaran mengenai rancangan input output dari aplikasi CharCognitron.
33 3.4.1.1.Rancangan CharCognitron Menu
TitleBar
Module Site
StatusBar
Gambar 3.5. Rancangan CharCognitron
Bagian ini merupakan bagian utama dari aplikasi CharCognitron dimana semua modul akan ditampilkan pada bagian Module Site. Bagian Menu merupakan tempat menu utama diletakkan. TitleBar untuk menampilkan judul aplikasi sedangkan StatusBar untuk menampilkan informasi-informasi pendek tambahan.
34 3.4.1.2.Rancangan Sample Builder
Menu
ToolBar
SampleID
RegionIO
Drawing Area DataGrid
NavigationBar StatusBar Gambar 3.6. Rancangan Modul Sample Builder
SampleID merupakan bagian yang menampilkan informasi mengenai sampel yang sedang aktif seperti nama file sampel (SampleFile), karakter target (TargetChar), ID internal (SampleId), jumlah pixel aktif (NumOfDot), dan ukuran sampel (Dimension). ToolBar berisi tombol-tombol untuk navigasi serta manipulasi sampel. RegionIO merupakan bagian dimana jumlah region dari suatu kelompok sampel diatur, di bagian ini juga dapat diatur tampilan pada DataGrid, apakah akan menampilkan data numerik asli atau yang sudah ternormalisasi. DrawingArea merupakan tempat menuliskan/ menggambarkan sampel huruf. NavigationBar berisi tombol-tombol navigasi sampel. DataGrid menampilkan informasi data numerik dari setiap sampel.
35 3.4.1.3.Rancangan Learning Activity 1. Structure
Menu
HiddenBiasIn StructureInfo
HiddenCombo
HiddenWeightDetail
OutputNeuron RLo ResetButton
RHi
RandomButton
StatusBar Gambar 3.7. Rancangan Modul Learning Activity | Structure
StructureInfo menampilkan informasi tentang struktur JSB yang digunakan yaitu algoritma dan fungsi aktivasi serta jumlah neuron pada masingmasing neuron. HiddenCombo digunakan untuk memilih tampilan neuron lapisan tersembunyi pada bagian sebelah kanan. OutputNeuron memperlihatkan data numerik bias dari neuron-neuron output. HiddenBiasIn memberikan informasi tentang neuron lapisan tersembunyi yang mana yang sedang ditampilkan, sekaligus juga dapat digunakan untuk menginisialisasi nilai bias secara manual. HiddenWeightDetail memperlihatkan rincian data numerik bobot untuk neuron tersembunyi yang sedang aktif. RLo dan RHi digunakan untuk menentukan jangkauan dari nilai inisialisasi acak, sedangkan RandomButton merupakan tombol untuk menggenerasi nilai-nilai acak tersebut dan memasukkannya ke dalam bobot dan bias setiap neuron. ResetButton merupakan tombol yang digunakan untuk me-nol-kan semua nilai yang sebelumnya sudah diinisialisasi.
36 2. Learning ParameterSetting digunakan untuk mengatur nilai-nilai parameter penentu JSB. EpochInfo menampilkan informasi tentang nilai epoch serta nilai error terakhir. OutputLevel merupakan visualisasi dari tingkat keakuratan setiap neuron pada lapisan output, sedangkan CTB adalah tombol untuk menampilkan dialog CheckTarget. InitButton dapat digunakan untuk me-reset ulang JSB ke dalam kondisi inisialisasi. Reports merupakan tombol untuk menampilkan laporan mengenai JSB sampai dengan epoch terakhir yang dilakukan. ErrorChart menampilkan tingkat error yang dicapai pada setiap epoch dalam bentuk grafik. MatchBar menunjukkan tingkat keakuratan JSB (MatchLevel), CheckBox dibawahnya adalah untuk mengaktifkan MatchLevel HardTrapping atau sebaliknya. ErrorProgress menampilkan informasi tingkat error pada setiap epoch. Single untuk proses belajar 1 kali epoch, sedangkan Multi untuk beberapa kali epoch.
Menu
ToolBar
ParameterSetting ErrorChart Single
Multi
CTB
OutputLevel
InitButton
Reports
MatchBar
EpochInfo
ErrorProgress
StatusBar
Gambar 3.8. Rancangan Modul Learning Activity | Learning
37 3.4.1.4.Rancangan Testing Activity
Menu
LearnedChar
Drawing Area
IdentifyAs ClearButton IdentifyButton
StatusBar Gambar 3.9. Rancangan Modul Testing Activity
DrawingArea adalah bagian dimana dapat dituliskan karakter yang akan kita ujikan. ClearButton adalah tombol untuk membersihkan bagian DrawingArea yang sudah ditulisi, sedangkan IdentifyButton adalah tombol untuk memulai proses identifikasi. LearnedChar manampilkan informasi tentang karakterkarakter apa saja yang sudah dipelajari oleh JSB. IdentifyAs menampilkan huruf hasil identifikasi setelah proses identifikasi selesai dilakukan.
38 3.4.1.5.Rancangan Open/Save Dialog
FolderCombo
ToolBar
FolderDetail
FileName FileTypeCombo
OKButton CancelButton
Gambar 3.10. Rancangan Open/Save Dialog
FolderCombo merupakan ComboBox yang digunakan untuk memilih Folder. ToolBar berisi tombol-tombol penunjang. FolderDetail menampilkan rincian file pada Folder aktif, sekaligus juga dapat digunakan untuk navigasi Folder. FileName digunakan untuk menuliskan nama file secara langsung tanpa memilih dari bagian FolderDetail. FileTypeCombo adalah ComboBox yang digunakan untuk memilih tipe file yang akan diaktifkan sebagai filter. OKButton merupakan tombol untuk mengakhiri proses pada kotak dialog ini setelah bagian FileName terisi, sedangkan CancelButton adalah tombol yang digunakan untuk mengakhiri proses pada kotak dialog ini dan mengagalkan pemilihan file.
39 3.4.1.6.Rancangan CheckTarget Dialog
ToolBar SampleInfo TC
SNo
IA
TargetDetail
Gambar 3.11. Rancangan CheckTarget Dialog
ToolBar hanya berisi satu tombol untuk keluar dari kotak dialog ini. SampleInfo berisi informasi mengenai sampel yang sedang aktif seperti SampleFile (nama file sampel), Num Of Sample(s) (jumlah sampel), SNo (indeks sample yang sedang aktif) sekaligus juga dapat digunakan untuk memilih sampel yang akan dicek, serta ID yang menunjukkan ID internal dari sampel aktif. TC akan menampilkan karakter yang diharapkan dari sampel yang aktif, sedangkan IA akan menampilkan karakter hasil identifikasi sementara oleh JSB. TargetDetail digunakan untuk menampilkan rincian data numerik dari setiap sampel yang sedang dicek.
40 3.4.1.7.Rancangan Reports Dialog
ToolBar
ReportDetail
Gambar 3.12. Rancangan Reports Dialog
ToolBar berisi tombol-tombol Save As (menyimpan report), Copy to ClipBoard (mengutip report ke memori), dan Close (menutup kotak dialog). ReportDetail menampilkan semua informasi mengenai sampel dan JSB sampai dengan iterasi terakhir. 3.4.2. Memulai Aplikasi CharCognitron
Setelah proses instalasi selesai dijalankan, maka aplikasi CharCognitron dapat segera digunakan. Setelah diaktifkan maka akan tampak tampilan awal aplikasi seperti terlihat pada Gambar 3.13. Pada tampilan awal tersebut belum ada satupun modul yang diaktifkan. Tampilan awal tersebut berisi menu utama dan tampilan pembuka berupa berbagai keterangan mengenai aplikasi ini, pembuat aplikasi, serta beberapa informasi lainnya. 3.4.2.1.Membuat Proyek baru Untuk dapat menjalankan modul-modul berikutnya, ada beberapa alternatif cara untuk memulai modul lain. Alternatif pertama adalah dengan cara membuat proyek baru. Caranya dengan mengakses menu File | New Project, atau cukup menggunakan shortcut Ctrl+N atau Alt+F+N. Kemudian akan terbukalah modul pertama yaitu modul Sample Builder.
41
Gambar 3.13. Tampilan awal Aplikasi CharCognitron
3.4.2.2.Membuka Proyek yang sudah ada Alternatif kedua yaitu apabila ada proyek yang sudah pernah dibuat sebelumnya, proyek tersebut dapat dibuka kembali dengan cara mengakses menu File | Open Project atau dengan shortcut Ctrl+O atau Alt+F+O. Selanjutnya akan ditampilkan kotak dialog untuk pemilihan file proyek. Pilih file proyek yang akan
Gambar 3.14. Tampilan Kotak Dialog Open Project
42 dibuka kemudian tekan tombol Open, maka akan terbukalah proyek tersebut dan akan diaktifkan pula modul pertama yaitu modul Sample Builder.
Gambar 3.15. Tampilan awal Modul Sample Builder
3.4.2.3.Menyimpan Proyek yang sudah dibuat Bila telah dilakukan berbagai proses seperti manipulasi sampel, pembelajaran JSB atau pengujian JSB, semua hasil percobaan tersebut dapat disimpan dengan mengakses menu File | Save As atau Alt+F+A, bila proyek tersebut adalah proyek baru atau akan disimpan dengan nama lain, atau File | Save atau Alt+F+S bila proyek tersebut pernah disimpan sebelumnya. 3.4.2.4.Menutup File Proyek Untuk menutup proyek yang sedang aktif dapat dilakukan dengan cara mengakses menu File | Close atau Alt+F+C. Hal ini seringkali harus dilakkukan apabila hendak membuka proyek lain ataupun memulai proyek baru sementara ada proyek yang sedang aktif.
43 3.4.2.5.Menutup Aplikasi Untuk mengakhiri pengunaan aplikasi atau keluar dari aplikasi CharCognitron, dapat dilakkan dengan cara mengakses menu File | Exit atau
Alt+F+X. 3.4.3. Manipulasi Sampel pada Modul Sample Builder Setelah modul Sample Builder aktif, maka proses manipulasi sampel dapat segera dilakukan. Bila modul ini telah diaktifkan, maka pada menu utama terdapat satu menu tambahan yaitu Sample. Selain itu pada bagian yang sama telah pula ditambahkan suatu ToolBar yang berisi tombol-tombol untuk memanipulasi sampel. Sampel-sampel yang akan digunakan pada aplikasi ini tersimpan dalam file-file sampel. Untuk memulai aktifitas pada modul ini, perhatikan petunjuk berikut. 3.4.3.1. Membuat File Sampel baru Sebelum dapat membuat atau merancang suatu sampel, terlebih dahulu
Gambar 3.16. Tampilan Modul Sample Builder | New Sample
44 harus dibuat file sampel yang akan digunakan untuk menampung data-data dari sampel yang akan dibuat. Untuk membuat file sampel baru dapat dilakukan dengan cara mengakses menu Sample | New Sample. Maka berikutnya akan tampak tampilan seperti terlihat pada Gambar 3.16. 3.4.3.2. Membuka File Sample yang sudah ada
Gambar 3.17. Tampilan Modul Sample Builder | Load Sample
Untuk membuka file sampel yang sudah dibuat sebelumnya dapat dilakukan dengan cara mengakses menu Sample | Load Sample. Setelah file sampel dibuka maka akan terlihat tampilan DataGrid seperti yang dapat terlihat pada Gambar 3.17. 3.4.3.3. Menyimpan File Sampel Bila telah selesai memanipulasi sampel, maka untuk menyimpan sampelsampel tersebut ke dalam file dapat dilakukan dengan cara mengakses menu Sample | Save As untuk menyimpan file sampel baru atau menyimpan dengan
45 nama lain, dan menu Sample | Save untuk menyimpan file sampel yang pernah disimpan sebelumnya. 3.4.3.4. Menutup File Sampel Untuk menutup file sampel yang sedang aktif dapat dilakukan dengan cara mengakses menu Sample | Close.
3.4.3.5. Menambah Sampel Untuk menambah sampel dapat dilakukan dengan pertama kali menekan tombol
yang terdapat pada ToolBar. Kemudian tulislah huruf atau angka
yang akan dibuat sampelnya, lalu masukkan pula TargetChar-nya. Bila sudah akhiri dengan menekan tombol
yang juga terdapat pada ToolBar. Untuk
membersihkan DrawingArea apabila terjadi kesalahan penulisan, cukup tekan tombol
pada ToolBar. Untuk membatalkan penambahan sampel, tekan
tombol
pada ToolBar.
3.4.3.6. Menghapus Sampel Untuk menghapus sampel yang tidak diinginkan dapat dilakukan dengan cara menekan tombol
.
3.4.3.7. Mengubah komposisi Region Pembagian area (Region) pada suatu sampel dapat diatur komposisinya. Tetapi pada CharCognitron nilai Region tersebut dibatasi jumlah maksimalnya sebanyak 20 area. Jumlah Region tersebut didapat dari hasil perkalian nilai baris (Row) dan kolom (Column). Sebagai nilai default adalah 5 baris dan 4 kolom.
Gambar 3.18. Mengatur komposisi Region
46
a. Data b. Data Ternormalisasi Asli Gambar 3.19. Mengubah tampilan data pada DataGrid
3.4.3.8. Mengubah Tampilan data pada DataGrid Seperti telah dibahas sebelumnya bahwa DataGrid akan menampilkan data numerik yang diperoleh dari setiap Region pada masing-masing sampel. Secara default data numerik yang ditampilkan adalah nilai pixel aktif yang belum dinormalisasi. Untuk mengubahnya ke dalam bentuk yang sudah ternormalisasi, cukup berikan tanda check pada CheckBox Normalized, dan begitu pula sebaliknya. 3.4.3.9. Tombol-tombol Navigasi 1. First
: pilih sampel pertama
2. Last
: pilih sampel terakhir
3. Previous
: pilih sampel sebelumnya
4. Next
: pilih sampel berikutnya
5. MoveLeft
: pindahkan sampel ke urutan sebelumnya
6. MoveRight
: pindahkan sampel ke urutan sesudahnya
47 3.4.4. Proses belajar dengan Modul Learn Activity Bila proses manipulasi sampel telah selesai dilakukan dan sudah diperoleh sekumpulan
sampel
yang
konsisten,
maka
proses
berikutnya
adalah
‘mengumpankan’ sampel-sampel tersebut ke dalam mesin JSB. Untuk itu masuklah ke modul Learn Activity, seperti terlihat pada Gambar 3.20.
Gambar 3.20. Tampilan awal modul Learn Activity | Structure
3.4.4.1.Mengganti Tampilan Neuron Hidden yang aktif Hal ini dapat dilakukan dengan cara mengakses bagian HiddenCombo, kemudian memilih neuron pada lapisan hidden yang mana yang akan ditampilkan rincian nilainya. Bagian ini terdapat pada sub modul Structure. 3.4.4.2.Meng-inisialisasi nilai acak Untuk menggenerasi nilai acak pada JSB, cukup tekan tombol Randomize Values. Tetapi sebelumnya tentukan terlebih dahulu jangkauan nilai acak tersebut pada bagian RandSeed range.
48
Gambar 3.21. Inisialisasi nilai acak
3.4.4.3.Me-nol-kan nilai JSB Nilai pada JSB yang sudah diinisialisasi dengan nilai acak dapat kita nolkan dengan cara menekan tombol Reset to Zero. 3.4.4.4.Menentukan nilai-nilai parameter penentu Sebelum proses belajar dilakukan sebaiknya diperiksa dahulu nilai-nilai parameter penentu, apakah sudah sesuai dengan yang diinginkan atau belum. Hal ini penting dilakukan mengingat bahwa pengaruh parameter-parameter ini sangat besar pada hasil akhir dari JSB. Pada kondisi awal parameter-parameter tersebut bernilai sebagai berikut : LearnRate = 0.2; Momentum = 0.5; Stopping Criteria Error = 0.1; Step(s)/Execution = 100. Bagian terdapat pada sub modul Learning, dan perlu diingat bahwa sub modul ini tidak dapat dimasuki jika JSB belum diinisialisasi dengan nilai acak. 3.4.4.5.Memulai proses belajar Untuk memulai proses belajar satu langkah per eksekusi, cukup tekan tombol Single Step. Sedangkan apabila menginginkan beberapa kali iterasi dalam satu langkah tekan tombol Multi Step. Jumlah iterasi yang dilakukan pada setiap langkah eksekusi sesuai dengan jumlah yang ditentukan pada bagian Step(s)/Execution.
49
Gambar 3.22. Tampilan awal modul Learning Activity | Learning
Gambar 3.23. Tampilan modul Learning Activity | Learning pada epoch = 100
50
3.4.4.6. HardTrapping MatchLevel
Bila
fasilitas
pengecekan
tingkat
kebenaran
terhadap
sampel
(HardTrapping MatchLevel) diaktifkan (perhatikan tanda CheckBox di bawah MatchBar) dan kondisi MatchLevel = 100%, maka akan ditampilkan kotak dialog yang menginformasikan bahwa kondisi tersebut telah terpenuhi.
Gambar 3.24. Kotak dialog HardTrapping MatchLevel
3.4.4.7. Menampilkan kotak dialog Check Target
Untuk melakukan pengecekkan terhadap tingkat keakuratan JSB pada setiap sampel, cukup tampilkan kotak dialog Check Target dengan cara menekan tombol T. Pada kotak dialog ini ditampilkan informasi mengenai sampel yang aktif berikut tingkat keakuratan JSB terhadap sampel tersebut.
Gambar 3.25. Kotak dialog Check Target
51 3.4.4.8. Menampilkan kotak dialog Learning Reports
Untuk mendapatkan informasi secara menyeluruh mengenai kondisi terakhir dari JSB, cukup tampilkan kotak dialog Learning Reports dengan cara menekan tombol Reports. Pada kotak dialog ini ditampilkan informasi mengenai sampel-sampel yang aktif, status JSB, tingkat keakuratan JSB, dll.
Gambar 3.26. Kotak dialog Learning Reports
3.4.4.9. Meng-inisialisasi ulang JSB
Untuk menginisialisasi ulang JSB cukup tekan tombol Initialize Neurons!, maka semua nilai neurons berikut hasil belajar terakhir akan di-inisialisasi serta nilai epoch dikembalikan ke nol. Sebetulnya tombol ini sama fungsinya dengan tombol Randomize Values.
52 3.4.5. Menguji JSB menggunakan Modul Testing Activity Proses belajar sebaiknya diakhiri apabila JSB kondisi Stopping Criteria Error atau HardTrapping MatchLevel sudah terpenuhi. Dengan demikian hampir dapat dipastikan bahwa JSB sudah berada dalam kondisi prima dan siap diuji. Untuk memasuki tahap pengujian, masuklah ke modul Testing Activity, seperti terlihat pada Gambar 3.27. Langkah pertama adalah menuliskan huruf atau angka yang akan diidentifikasi. Tentu saja huruf atau angka tersebut sebaiknya yang sudah dipelajari oleh JSB (dapat dilihat pada kotak Learned Char), bila tidak maka kemungkinan untuk bisa dikenali mendekati nol persen.
Gambar 3.27. Tampilan modul Testing Activity
Setelah menuliskan huruf atau angka pada Drawing Area, langkah selanjutnya adalah menekan tombol Identify ! untuk memulai proses identifikasi. Bila proses identifikasi sudah selesai maka huruf atau angka hasil identifikasi tersebut akan ditampilkan pada kotak Identified As. Untuk mengulang proses diatas, sebaiknya Drawing Area dibersihkan dahulu dengan cara menekan tombol Clear.
Bab IV Analisa dan Simulasi Percobaan 4.1.
Mempersiapkan Sampel Sebelum bisa dimulai suatu analisa terhadap JSB, hendaknya dipersiapkan
terlebih dahulu sampel yang akan dipergunakan dalam percobaan. Tentunya pembuatan sampel perlu diperhatikan dengan cermat guna memperoleh data yang konsisten terhadap nilai acuan target. 4.1.1. Karakteristik Sampel yang Baik Karakteristik sampel yang baik harus memenuhi kriteria
yaitu bahwa
antara sampel-sampel yang sejenis (sama nilai target acuannya; misal ‘A’) harus memiliki bentuk keterbacaan yang sama (Human Readable Character). Bentuk dari sampel-sampel tersebut harus konsisten dengan nilai acuannya sehingga diharapkan akan menghasilkan kumpulan sampel yang konsisten dan seragam.
A Target Acuan
Gambar 4.1. Contoh sampel yang baik
B Target Acuan
Gambar 4.2. Contoh sampel yang tidak baik
53
54 4.1.2. Optimasi dan Efektifitas Jumlah Sampel Jumlah sampel yang akan diuji merupakan masalah berikutnya yang harus dianalisa. Sesuai dengan karakteristik JSB sendiri yang sangat empiris, maka jumlah dari sampel-sampel yang akan ‘diumpankan’ ke dalamnya pun harus dilakukan secara empiris pula melalui beberapa percobaan. Namun secara logis tentunya jumlah sampel ini harus lebih dari satu untuk setiap sampel dengan acuan yang sama. Dan tentu saja harus ada lebih dari satu nilai target acuan dalam suatu kumpulan sampel. Tabel 4.1. Komposisi Sampel Group Sample
Sample1 [100]
Sample2 [100]
Sample3 [60]
Target Acuan
Jumlah Sampel
ASCII
A I U E O a i u e o 0 1 2 3 4 5
20 20 20 20 20 20 20 20 20 20 10 10 10 10 10 10
65 73 85 69 79 97 105 117 101 111 48 49 50 51 52 53
Kode Target Dec
Bin
10 18 30 14 24 36 44 56 40 50 0 1 2 3 4 5
001010 100010 011110 001110 011000 100100 101100 111000 101000 110010 000000 000001 000010 000011 000100 000101
Selain masalah diatas, jumlah sampel juga akan sangat mempengaruhi performasi dari JSB jika dilihat dari jumlah iterasi yang harus dilakukan pada setiap epoch-nya yang berbanding lurus dengan jumlah sampel. Untuk itu diperlukan optimalisasi jumlah sampel yang akan diuji sehingga bisa didapatkan komposisi yang baik dengan jumlah sampel seminimal mungkin, tetapi tidak mengurangi reliabilitas serta konsistensi kumpulan sampel tersebut. Dikarenakan masalah-masalah tersebut bersifat empiris maka penulis membuat suatu komposisi percobaan seperti terlihat pada Tabel 4.1., bahwa untuk membuktikan bahwa konsep pengenalan huruf dan angka yang penulis buat bisa digunakan dengan memberikan hasil yang baik, tidak perlu harus semua target acuan yang mungkin (‘a’..’z’;’A’..’Z’;’0’..’1’) diujikan pada percobaan ini.
55
4.2.
Simulasi Aktifitas Belajar Setelah semua sampel dipersiapkan, langkah berikutnya adalah memulai
simulasi belajar untuk JSB. Untuk beberapa percobaan berikut hanya Sample1 saja yang akan dibahas pada bab ini dengan alasan efektifitas, hasil percobaan dan simulasi dapat dilihat pada Lampiran C. Tentunya sebelum memulai proses belajar ini ada beberapa hal yang harus dipersiapkan dan dibahas, seperti penentuan jangkauan nilai awal dan parameterparameter penentu lainnya. Percobaan-percobaan pertama yang dilakukan adalah analisa pengaruh nilai-nilai LearnRates, Momentum, dan terakhir adalah pengaruh jangkauan nilai awal. Untuk dua percobaan pertama digunakan jangkauan nilai awal -2 s/d 2. 4.2.1. Batasan dan Ketentuan Percobaan Percobaan yang akan dilakukan akan diberi beberapa batasan sehingga dapat diperoleh hasil yang efektif. Adapun batasan-batasan tersebut antara lain adalah : 1. Sampel yang akan digunakan pada pembahasan dan analisa adalah Sample1 dengan Region = 5*4; 2. Jumlah epoch maksimum adalah 1000; 3. Proses belajar dihentikan apabila sudah tercapai salah satu dari dua kriteria, yaitu HardTrappping MatchLevel atau Stopping Criteria Error; 4. Untuk setiap kasus dilakukan beberapa kali percobaan dan diambil satu yang terbaik untuk ditampilkan dalam pembahasan, dan untuk dijadikan acuan sementara bagi proses belajar berikutnya; 5. Hasil terbaik dari percobaan ditentukan dari nilai HardTrapping MatchLevel terbesar dan atau nilai Stopping Criteria Error terkecil; 6. Percobaan dinyatakan berhasil apabila tercapai kondisi MatchLevel=100%, yang artinya bahwa JSB tersebut ‘sudah dapat mengenali dirinya sendiri’; 7. Tujuan utama dari percobaan ini adalah untuk mendapatkan karakteristik JSB yang terbaik sehingga JSB tersebut dapat ‘mempelajari’ pola yang diberikan dengan baik.
56 4.2.2. Pengaruh LearnRates Untuk melakukan analisa pengaruh LearnRates terhadap JSB, pertama kali harus ditetapkan nilai Momentum = 0, agar percobaan ini tidak terpengaruh oleh nilai Momentum tersebut. Percobaan ini dilakukan pada nilai-nilai LearnRates yang kritis dan cukup ekstrim yaitu 0,1; 0,2; 0,5; 0,9; 1. Walaupun nilai LearnRates sendiri adalah bilangan real yang lebih besar dari nol, tetapi nilai di atas satu sangatlah tidak dianjurkan, mengingat bahwa dengan semakin tingginya nilai LearnRates, maka karakteristik JSB menjadi semakin ‘liar’ (sangat berfluktuasi) dan tidak dapat diduga (unpredictable). Pada simulasi-simulasi berikut, hanya ditampilkan grafik ErrorLevel dan hasil yang dicapainya yaitu berupa nilai ErrorLevel, MatchLevel, dan nilai epoch terakhir. 1. Simulasi 1, LearnRates = 0.1
Epoch = 1000; ErrorLevel = 29.19698; MatchLevel = 43% Gambar 4.3. Simulasi 1 Pengaruh LearnRates pada LearnRates = 0.1; Momentum = 0
57 2. Simulasi 2, LearnRates = 0.2
Epoch = 1000; ErrorLevel = 45.42733; MatchLevel = 55% Gambar 4.4. Simulasi 2 Pengaruh LearnRates pada LearnRates = 0.2; Momentum = 0
3. Simulasi 3, LearnRates = 0.5
Epoch = 1000; ErrorLevel = 40.53675; MatchLevel = 54% Gambar 4.5. Simulasi 3 Pengaruh LearnRates pada LearnRates = 0.5; Momentum = 0
4. Simulasi 4, LearnRates = 0.9
Epoch = 1000; ErrorLevel = 79.49562; MatchLevel = 20% Gambar 4.6. Simulasi 4 Pengaruh LearnRates pada LearnRates = 0.9; Momentum = 0
58 5. Simulasi 5, LearnRates = 1
Epoch = 1000; ErrorLevel = 119.99389; MatchLevel = 0% Gambar 4.7. Simulasi 5 Pengaruh LearnRates pada LearnRates = 1; Momentum = 0
Dari ke lima simulasi tersebut dapat dibuat kesimpulan bahwa LearnRates terbaik dengan ErrorLevel paling rendah adalah 0,1 dan LearnRates terbaik berdasarkan MatchLevel tertinggi adalah 0,2. Tetapi dikarenakan tingkat keberhasilan dari percobaan ini tidak diukur berdasarkan rendahnya nilai ErrorLevel, melainkan dari tingginya nilai MatchLevel, maka Simulasi 2 dengan LearnRates = 0,2 yang akan digunakan pada percobaan berikutnya. Tabel 4.2. Hasil percobaan pengaruh LearnRates Percobaan
LearnRates
Epoch
ErrorLevel
MatchLevel
Simulasi 1 Simulasi 2 Simulasi 3 Simulasi 4 Simulasi 5
0.1 0.2 0.5 0.9 1
1000 1000 1000 1000 1000
29.19698 45.42733 40.53675 79.49562 119.99389
43% 55% 54% 20% 0%
4.2.3. Pengaruh Momentum Percobaan berikut akan menggunakan nilai LearnRates terbaik yang didapat dari percobaan sebelumnya dan menggunakan nilai Momentum yang berbeda (0,1;0,2;0,5;0,8;0,9;1) untuk dianalisa hasil terbaik berdasarkan nilai Momentum tersebut. Adapun parameter lainnnya seperti jangkauan nilai awal, masih sama dengan percobaan sebelumnya. Berikut hasil beberapa simulasi yang dilakukan terhadap perubahan nilai Momentum.
59 1. Simulasi 1, Momentum = 0.1
Epoch = 1000; ErrorLevel = 25.48247; MatchLevel = 80% Gambar 4.8. Simulasi 1 Pengaruh Momentum pada LearnRates = 0.2; Momentum = 0.1
2. Simulasi 2, Momentum = 0.2
Epoch = 1000; ErrorLevel = 47.16077; MatchLevel = 45% Gambar 4.9. Simulasi 2 Pengaruh Momentum pada LearnRates = 0.2; Momentum = 0.2
3. Simulasi 3, Momentum = 0.5
Epoch = 215; ErrorLevel = 12.87525; MatchLevel = 100% Gambar 4.10. Simulasi 3 Pengaruh Momentum pada LearnRates = 0.2; Momentum = 0.5
60 4. Simulasi 4, Momentum = 0.8
Epoch = 1000; ErrorLevel = 30.6719; MatchLevel = 65% Gambar 4.11. Simulasi 4 Pengaruh Momentum pada LearnRates = 0.2; Momentum = 0.8
5. Simulasi 5, Momentum = 0.9
Epoch = 1000; ErrorLevel = 27.94824; MatchLevel = 67% Gambar 4.12. Simulasi 5 Pengaruh Momentum pada LearnRates = 0.2; Momentum = 0.9
6. Simulasi 6, Momentum = 1
Epoch = 1000; ErrorLevel = 50.2894; MatchLevel = 52% Gambar 4.13. Simulasi 6 Pengaruh Momentum pada LearnRates = 0.2; Momentum = 1
61 Tabel 4.3. Hasil percobaan pengaruh Momentum Percobaan
Momentum
Epoch
ErrorLevel
MatchLevel
Simulasi 1 Simulasi 2 Simulasi 3 Simulasi 4 Simulasi 5 Simulasi 6
0.1 0.2 0.5 0.8 0.9 1
1000 1000 215 1000 1000 1000
25.48247 47.16077 12.87525 30.6719 27.94824 50.2894
80% 45% 100% 65% 67% 52%
Dari enam simulasi di atas dapat disimpulkan bahwa nilai Momentum terbaik diperoleh pada Simulasi 3 dengan nilai Momentum = 0,5. Pada Simulasi 3 tersebut diperoleh nilai keberhasilan MatchLevel = 100% pada epoch 215 yang sangat menunjukkan bahwa JSB dapat belajar dengan baik pada kondisi ini. Oleh karenanya kombinasi nilai LearnRates dan Momentum inilah yang untuk sementara dapat dijadikan acuan terbaik untuk analisa berikutnya. 4.2.4. Pengaruh Jangkauan Nilai Awal Berikutnya adalah percobaan untuk menganalisa pengaruh jangkauan nilai awal pada JSB. Pada percobaan ini akan digunakan JSB dengan karakteristik terbaik yang didapatkan dari percobaan sebelumnya yaitu nilai LearnRates = 0,2 dan nilai Momentum = 0,5. Berikut hasil beberapa simulasi terhadap perbedaan jangkauan nilai awal. 1. Simulasi 1, Jangkauan 0 s/d +2 (Asimetris)
Epoch = 1000; ErrorLevel = 119.99886; MatchLevel = 0% Gambar 4.14. Simulasi 1 Pengaruh Jangkauan pada jangkauan 0 s/d +2
62 2. Simulasi 2, Jangkauan 0 s/d +5 (Asimetris)
Epoch = 1000; ErrorLevel = 239.99459; MatchLevel = 0% Gambar 4.15. Simulasi 2 Pengaruh Jangkauan pada jangkauan 0 s/d +5
3. Simulasi 3, Jangkauan -5 s/d 0 (Asimetris)
Epoch = 1000; ErrorLevel = 30.69999; MatchLevel = 74% Gambar 4.16. Simulasi 3 Pengaruh Jangkauan pada jangkauan -5 s/d 0
4. Simulasi 4, Jangkauan -2 s/d 0 (Asimetris)
Epoch = 1000; ErrorLevel = 42.82592; MatchLevel = 41% Gambar 4.17. Simulasi 4 Pengaruh Jangkauan pada jangkauan -2 s/d 0
63 5. Simulasi 5, Jangkauan -5 s/d 2 (Asimetris)
Epoch = 1000; ErrorLevel = 35.93632; MatchLevel = 59% Gambar 4.18. Simulasi 5 Pengaruh Jangkauan pada jangkauan -5 s/d +2
6. Simulasi 6, Jangkauan -2 s/d +5 (Asimetris)
Epoch = 1000; ErrorLevel = 139.87458; MatchLevel = 20% Gambar 4.19. Simulasi 6 Pengaruh Jangkauan pada jangkauan -2 s/d +5
7. Simulasi 7, Jangkauan -2 s/d +2 (Simetris)
Epoch = 215; ErrorLevel = 12.87525; MatchLevel = 100% Gambar 4.20. Simulasi 7 Pengaruh Jangkauan pada jangkauan -2 s/d +2
64 8. Simulasi 8, Jangkauan -5 s/d +5 (Simetris)
Epoch = 1000; ErrorLevel = 13.38231; MatchLevel = 91% Gambar 4.21. Simulasi 8 Pengaruh Jangkauan pada jangkauan -5 s/d +5
Dari simulasi-simulasi di atas dapat diperoleh kesimpulan yaitu bahwa JSB memiliki kecenderungan belajar yang lebih baik dengan pemilihan jangkauan simetris dan sebaliknya untuk asimetris. Dari Simulasi 7 dan Simulasi 8 terlihat bahwa dengan magnitasi lebih kecil (-2 s/d +2), JSB juga memiliki kecenderungan belajar yang lebih baik. Untuk itu pada percobaan berikutnya akan dipergunakan jangkauan nilai tersebut.
Tabel 4.4. Hasil percobaan pengaruh Jangkauan Percobaan
Jangkauan
Epoch
ErrorLevel
MatchLevel
Simulasi 1 (A) Simulasi 2 (A) Simulasi 3 (A) Simulasi 4 (A) Simulasi 5 (A) Simulasi 6 (A) Simulasi 7 (S) Simulasi 8 (S)
0 s/d +2 0 s/d +5 -5 s/d 0 -2 s/d 0 -5 s/d 2 -2 s/d +5 -2 s/d +2 -5 s/d +5
1000 1000 1000 1000 1000 1000 215 1000
119.99886 239.99459 30.69999 42.82592 35.93632 139.87458 12.87525 13.38231
0% 0% 74% 41% 59% 20% 100% 91%
65
4.3.
Pengaruh Komposisi Region pada Sampel terhadap JSB Dari semua percobaan di atas telah didapat suatu karakteristik JSB yang
baik dengan parameter-parameter nilai LearnRates = 0,2; Momentum = 0,5 dan jangkauan nilai awal = -2 s/d +2. Percobaan-percobaan tersebut sudah dapat cukup membuktikan bahwa metode pengenalan pola huruf dan angka tulisan tangan yang dibuat oleh penulis dapat ‘dipelajari’ dengan baik oleh JSB. Hal tersebut ditandai dengan tercapainya nilai MatchLevel = 100% dengan karakteristik yang dimaksud. Namun untuk lebih melengkapi percobaan dan analisa terhadap metode ini, maka penulis melakukan satu lagi percobaan yaitu pengaruh komposisi Region terhadap karakteristik JSB dan hasil akhir yang akan didapat. Berikut hasil dari beberapa simulasi yang dilakukan. 1. Simulasi 1, Region = 5*4
Epoch = 215; ErrorLevel = 12.87525; MatchLevel = 100% Gambar 4.22. Simulasi 1 Pengaruh Region pada Region = 5*4
2. Simulasi 2, Region = 4*5
Epoch = 1000; ErrorLevel = 40.38083; MatchLevel = 58% Gambar 4.23. Simulasi 2 Pengaruh Region pada Region 4*5
66 3. Simulasi 3, Region = 4*4
Epoch = 1000; ErrorLevel = 38.39191; MatchLevel = 45% Gambar 4.24. Simulasi 3 Pengaruh Region pada Region 4*4
4. Simulasi 4, Region = 3*3
Epoch = 1000; ErrorLevel = 40.23196; MatchLevel = 59% Gambar 4.25. Simulasi 4 Pengaruh Region pada Region 3*3
5. Simulasi 5, Region = 4*3
Epoch = 1000; ErrorLevel = 36.55019; MatchLevel = 53% Gambar 4.26. Simulasi 5 Pengaruh Region pada Region 4*3
67 6. Simulasi 6, Region = 3*4
Epoch = 1000; ErrorLevel = 26.20377; MatchLevel = 78% Gambar 4.27. Simulasi 6 Pengaruh Region pada Region 3*4
Dari ke enam simulasi tersebut dapat dilihat bahwa Simulasi 1 memberikan hasil belajar paling baik. Oleh karena itu dapat disimpulkan sementara bahwa komposisi Region 5*4 adalah yang terbaik. Tabel 4.5. Hasil percobaan pengaruh komposisi Region
4.4.
Percobaan
Region
Epoch
ErrorLevel
MatchLevel
Simulasi 1 Simulasi 2 Simulasi 3 Simulasi 4 Simulasi 5 Simulasi 6
5*4 4*5 4*4 3*3 4*3 3*4
215 1000 1000 1000 1000 1000
12.87525 40.38083 38.39191 40.23196 36.55019 26.20377
100% 58% 45% 59% 53% 78%
Hasil Akhir Percobaan dengan Sampel lain Sebelumnya penulis sudah menyiapkan beberapa kumpulan sampel,
namun dengan alasan efektifitas hanya tiga kelompok sampel saja yang akan disajikan pada penulisan ini. Sampel pertama merupakan kelompok sampel yang telah dipakai sebelumnya untuk keperluan analisa karakteristik JSB terbaik. Dengan menggunakan hasil analisa tersebut, yaitu karakteristik JSB yang dimaksud, penulis melakukan percobaan untuk dua sampel berikutnya. Berikut hasil simulasi belajar menggunakan sampel-sampel tersebut. Data percobaan selengkapnya dapat dilihat pada halaman lampiran.
68 1. Simulasi 1, Sample2 [‘a’,’i’,’u’,’e’,’o’] [20/100]
Epoch = 100; ErrorLevel = 12.19814; MatchLevel = 100% Gambar 4.28. Simulasi 1 Sample2 [‘a’,’i’,’u’,’e’,’o’] [20/100]
2. Simulasi 2, Sample3 [‘0’,’1’,’2’,’3’,’4’,’5’] [10/60]
Epoch = 310; ErrorLevel = 4.40524; MatchLevel = 100% Gambar 4.29. Simulasi 2 Sample3 [‘0’,’1’,’2’,’3’,’4’,’5’] [10/60]
Ke dua simulasi di atas memberikan hasil terbaik dengan dicapainya MatchLevel = 100%. Dari dua simulasi tersebut dapat diambil kesimpulan bahwa metode yang penulis ciptakan untuk pengenalan pola huruf dan angka tulisan tangan dapat ‘dikenali’ dengan baik oleh JSB. Dengan demikian metode untuk pengekstrakan data dari huruf dan angka tulisan tangan dalam representasi citra yang penulis buat bersifat Learnable untuk jaringan syaraf buatan atau Artificial Neural Networks. Tabel 4.6. Hasil akhir percobaan dengan semua sampel Group Sampel
Epoch
ErrorLevel
MatchLevel
Sampel1 Sampel2 Sampel3
215 100 310
12.87525 12.19814 4.40524
100% 100% 100%
Bab V Penutup 5.1.
Kesimpulan Simulasi percobaan dan analisa yang telah dilakukan dan dipaparkan pada
bab sebelumnya telah menghasilkan beberapa kesimpulan yang dapat dianggap sebagai kesimpulan akhir dari penulisan ini. Kesimpulan utama yang dapat diambil yaitu bahwa metode pengenalan citra huruf dan angka tulisan tangan yang dibuat oleh penulis dapat diimplementasikan dengan baik terhadap suatu jaringan syaraf buatan tertentu dan telah dianalisa dengan menggunakan program aplikasi CharCognitron yang juga telah dibuat sebelumnya oleh penulis.
Secara teknis, ada beberapa hasil analisa yang dapat disimpulkan, diantaranya : 1. Dari analisa pengaruh LearnRates didapat kesimpulan bahwa nilai LearnRates terbaik untuk metode ini adalah 0,2; 2. Dari analisa pengaruh Momentum didapat kesimpulan bahwa nilai Momentum terbaik untuk metode ini adalah 0,5; 3. Dari analisa pengaruh jangkauan nilai awal diperoleh kesimpulan bahwa jangkauan nilai terbaik adalah -0,2 s/d +0,2; 4. Dari analisa pengaruh komposisi Region diperoleh kesimpuln bahwa komposisi Region terbaik adalah 5*4; Secara umum hal lain yang dapat disimpulkan dari analisa yang dilakukan, antara lain : 1. Pemilihan sampel yang baik mutlak harus dilakukan karena akan sangat mempengaruhi hasil akhir; 2. Untuk mendapatkan hasil yang terbaik dengan menggunakan JSB, harus dilakukan performance tunning terlebih dahulu terhadap JSB tersebut, sehingga didapatkan karakteristik khas untuk kasus ini; 3. Metode yang dibuat oleh penulis telah terbukti dapat ‘dipelajari’ (learnable) dan dikenali pola-polanya dengan baik oleh JSB;
69
70
5.2.
Saran Tentunya penulisan ini hanyalah berupa satu langkah awal menuju
pendalaman materi yang lebih baik mengenai JSB umumnya dan metode pengenalan pola khususnya. Penulis sangat menyadari bahwa dalam penulisan ini banyak terdapat kekurangan yang tidak dapat dihindarkan karena keterbatasan waktu penelitian dan alasan efektifitas penulisan. Oleh karenanya penulis sangat mengharapkan dukungan dari semua pihak berupa penelitian lebih lanjut dan komprehensif menyangkut metode yang penulis buat. Ada beberapa hal yang dapat penulis sarankan diantaranya yaitu penelitian yang dilakukan pada penulisan ini belum mengakomodasi semua karakter yang ada selain itu juga bahwa metode ini masih kurang teruji kehandalannya, jadi diharapkan diantara pembaca ada yang mau melakukan pengujian lebih lanjut.
Daftar Pustaka
[1] Alex Berson and Stephen J., Data Warehousing, Data Mining and Olap, McGraw Hill, USA, 1997 [2] Irwan Arifin, Perancangan Modul Program dan Praktikum Jaringan Neural Buatan, Gunadarma, Jakarta, 1999 [3] Simon Haykin, Neural Networks : a Comprehensif Foundation, Prentice Hall International Inc., New Jersey, 1999 [4] Kemal Ade Sekarwati, Jaringan http://www.gunadarma.ac.id, 1998
Syaraf
Tiruan,
[5] Braun Feulner Malaka, Praktikum Neural Netze, Spinger-Verlag, Berlin, 1996 [6] Igor Aleksander and Helen Morton, An Introduction to Neural Computing, Chapman and Hall, London, 1990 [7] Schneider, G. Michael and Bruell, Steven C., Advanced Programming and Problem Solving with Pascal, John Wiley and Sons, New York, 1987
71
Lampiran A. Tabel Konversi Kode Target
Kode Target Target ASCII Kode Target Target ASCII Dec Bin Dec Bin 0 1 2 3 4 5 6 7 8 9 A B C D E F G H I J K L M N O P Q R S T U V
48 49 50 51 52 53 54 55 56 57 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31
000000 000001 000010 000011 000100 000101 000110 000111 001000 001001 001010 001011 001100 001101 001110 001111 010000 010001 010010 010011 010100 010101 010110 010111 011000 011001 011010 011011 011100 011101 011110 011111
72
W X Y Z a b c d e f g h i j k l m n o p q r s t u v w x y z > ?
87 88 89 90 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 62 63
32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63
100000 100001 100010 100011 100100 100101 100110 100111 101000 101001 101010 101011 101100 101101 101110 101111 110000 110001 110010 110011 110100 110101 110110 110111 111000 111001 111010 111011 111100 111101 111110 111111
Lampiran B.1. Tabel Data Sample1 belum ternormalisasi
73
74
75
76
Lampiran B.2. Tabel Data Sample1 sudah ternormalisasi
77
78
79
Lampiran C.1. Data Simulasi Hasil Terbaik Sample1 SampleFile Num of Samples Regions Sample Varians TargetChar(s) InitVal Ranges Learn Rates Momentum Max ErrorLevel Epoch Last ErrorLevel MatchLevel Num Of Matched
No 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46
Target Char A A A A A A A A A A A A A A A A A A A A I I I I I I I I I I I I I I I I I I I I U U U U U U
Target Data 001010 001010 001010 001010 001010 001010 001010 001010 001010 001010 001010 001010 001010 001010 001010 001010 001010 001010 001010 001010 010010 010010 010010 010010 010010 010010 010010 010010 010010 010010 010010 010010 010010 010010 010010 010010 010010 010010 010010 010010 011110 011110 011110 011110 011110 011110
: : : : : : : : : : : : :
Sample1.spl 100 5*4 5 [A,I,U,E,O] -2 to 2 .2 .5 600 215 12.87525 100% 100 of 100
Out1
Out2
0.00293 0.00139 0.00122 0.00289 0.00253 0.00244 0.00263 0.00299 0.00253 0.00277 0.00281 0.00278 0.00248 0.00333 0.00237 0.00110 0.00263 0.00255 0.00153 0.00288 0.00605 0.00293 0.00488 0.00283 0.00439 0.00353 0.00389 0.00536 0.00282 0.00624 0.00349 0.00616 0.00363 0.00332 0.00457 0.00310 0.00404 0.00333 0.00552 0.00302 0.00572 0.00566 0.00444 0.00552 0.00543 0.00579
0.32661 0.34640 0.36971 0.38477 0.24878 0.23013 0.28058 0.44539 0.25057 0.35411 0.43576 0.49480 0.23822 0.41074 0.20338 0.38818 0.28937 0.23805 0.42164 0.46276 0.97538 0.90648 0.95610 0.88581 0.93070 0.93402 0.93049 0.92284 0.83619 0.95835 0.91221 0.96922 0.91724 0.92458 0.92562 0.90917 0.93416 0.89854 0.95024 0.91530 0.76646 0.76429 0.75593 0.75650 0.76888 0.77528
OutData Out3 Out4 0.95384 0.77011 0.70312 0.92200 0.96501 0.96618 0.95588 0.89072 0.96241 0.92476 0.88499 0.86099 0.96551 0.94521 0.97248 0.64801 0.95196 0.96912 0.72010 0.87937 0.16933 0.29900 0.22574 0.30119 0.30267 0.26425 0.28384 0.38556 0.41070 0.24631 0.30710 0.22312 0.30637 0.25234 0.30048 0.26328 0.26861 0.31622 0.25450 0.29707 0.87789 0.87568 0.82348 0.87972 0.87056 0.87353
80
0.08696 0.03145 0.02653 0.02130 0.18921 0.20188 0.09439 0.00899 0.14910 0.02929 0.01051 0.01230 0.18083 0.06187 0.31234 0.03761 0.08196 0.23364 0.01135 0.01091 0.00004 0.02929 0.00008 0.00760 0.00025 0.00461 0.00022 0.00099 0.00091 0.00368 0.01130 0.00007 0.00029 0.01158 0.00172 0.02639 0.00017 0.00037 0.01391 0.01755 0.87202 0.88683 0.80241 0.89760 0.85464 0.83448
Out5
Out6
Out Char
Match
0.85650 0.90659 0.91241 0.83488 0.88327 0.88763 0.86890 0.81559 0.87985 0.84371 0.82537 0.82750 0.88439 0.83693 0.89739 0.92245 0.86704 0.88582 0.88597 0.82340 0.52019 0.82280 0.59697 0.80507 0.67903 0.75552 0.66621 0.64353 0.76480 0.66645 0.77819 0.57046 0.69115 0.79595 0.70290 0.81759 0.65601 0.71756 0.72357 0.80496 0.85210 0.85526 0.86040 0.85938 0.84886 0.84456
0.00302 0.00996 0.01205 0.00472 0.00258 0.00258 0.00313 0.00609 0.00277 0.00459 0.00629 0.00639 0.00262 0.00317 0.00222 0.01304 0.00330 0.00235 0.01199 0.00622 0.02922 0.00500 0.02834 0.00798 0.02189 0.00871 0.02357 0.01295 0.01962 0.00301 0.00569 0.02187 0.02212 0.00549 0.00637 0.00464 0.02554 0.02336 0.00207 0.00606 0.00026 0.00025 0.00048 0.00024 0.00028 0.00029
A A A A A A A A A A A A A A A A A A A A I I I I I I I I I I I I I I I I I I I I U U U U U U
Yes Yes Yes Yes Yes Yes Yes Yes Yes Yes Yes Yes Yes Yes Yes Yes Yes Yes Yes Yes Yes Yes Yes Yes Yes Yes Yes Yes Yes Yes Yes Yes Yes Yes Yes Yes Yes Yes Yes Yes Yes Yes Yes Yes Yes Yes
No
Target Char
47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100
U U U U U U U U U U U U U U E E E E E E E E E E E E E E E E E E E E O O O O O O O O O O O O O O O O O O O O
Target Data 011110 011110 011110 011110 011110 011110 011110 011110 011110 011110 011110 011110 011110 011110 001110 001110 001110 001110 001110 001110 001110 001110 001110 001110 001110 001110 001110 001110 001110 001110 001110 001110 001110 001110 011000 011000 011000 011000 011000 011000 011000 011000 011000 011000 011000 011000 011000 011000 011000 011000 011000 011000 011000 011000
Out1
Out2
0.00572 0.00540 0.00558 0.00565 0.00606 0.00566 0.00556 0.00559 0.00518 0.00567 0.00509 0.00568 0.00569 0.00579 0.00122 0.00202 0.00332 0.00202 0.00120 0.00147 0.00213 0.00135 0.00107 0.00085 0.00149 0.00047 0.00053 0.00080 0.00113 0.00294 0.00031 0.00125 0.00194 0.00185 0.01758 0.01833 0.01778 0.01729 0.01753 0.01836 0.01798 0.01832 0.01586 0.01789 0.01812 0.01845 0.01715 0.01840 0.01778 0.01674 0.01764 0.01848 0.01816 0.01709
0.76884 0.75210 0.76403 0.76315 0.74499 0.77352 0.76082 0.77234 0.75517 0.76111 0.73999 0.76128 0.76307 0.77002 0.00944 0.07492 0.10526 0.01589 0.00681 0.01278 0.01550 0.00602 0.00315 0.00368 0.01036 0.00422 0.00097 0.00217 0.01381 0.27899 0.00045 0.04755 0.01196 0.02005 0.96688 0.96898 0.96894 0.95879 0.96747 0.96998 0.96646 0.96832 0.95463 0.96511 0.96760 0.97000 0.96410 0.97037 0.96896 0.96292 0.96732 0.97056 0.96865 0.96698
OutData Out3 Out4 0.87532 0.87704 0.87596 0.87636 0.89878 0.86940 0.87646 0.87011 0.87355 0.87928 0.88512 0.87851 0.87735 0.87697 0.99442 0.97071 0.97891 0.99523 0.99591 0.99493 0.99557 0.99703 0.99798 0.99668 0.99589 0.99522 0.99857 0.99798 0.99112 0.90828 0.99916 0.98379 0.99594 0.99365 0.75559 0.74852 0.74308 0.78062 0.74991 0.74422 0.76447 0.75027 0.78081 0.76270 0.75159 0.74310 0.76440 0.74206 0.74314 0.76659 0.75211 0.74072 0.75217 0.74999
81
0.87064 0.90756 0.88398 0.88968 0.89723 0.86810 0.89054 0.86122 0.90053 0.88435 0.89858 0.88632 0.88447 0.86279 0.99999 0.99865 0.99859 0.99995 1.00000 0.99991 0.99988 0.99999 1.00000 1.00000 0.99995 1.00000 1.00000 1.00000 0.99999 0.88065 1.00000 0.99731 0.99996 0.99992 0.00010 0.00009 0.00010 0.00021 0.00014 0.00008 0.00011 0.00009 0.00030 0.00012 0.00010 0.00009 0.00011 0.00008 0.00011 0.00012 0.00014 0.00008 0.00009 0.00013
Out5
Out6
Out Char
Match
0.85106 0.86383 0.85448 0.85592 0.86468 0.84893 0.85681 0.84901 0.85991 0.85579 0.86560 0.85744 0.85608 0.84986 0.98066 0.94681 0.91966 0.96378 0.98293 0.97165 0.96109 0.97971 0.98619 0.98901 0.97305 0.99295 0.99447 0.99064 0.97990 0.88890 0.99723 0.96689 0.96742 0.96472 0.34519 0.33532 0.33901 0.36205 0.35645 0.33056 0.35393 0.33158 0.38892 0.34317 0.33562 0.33217 0.35726 0.32731 0.34194 0.36116 0.35751 0.32560 0.33901 0.35568
0.00026 0.00024 0.00025 0.00025 0.00024 0.00026 0.00025 0.00027 0.00024 0.00025 0.00027 0.00025 0.00025 0.00026 0.00062 0.00161 0.00127 0.00063 0.00056 0.00069 0.00072 0.00055 0.00041 0.00049 0.00061 0.00035 0.00032 0.00038 0.00073 0.00357 0.00016 0.00132 0.00064 0.00070 0.00638 0.00646 0.00617 0.00588 0.00548 0.00642 0.00600 0.00641 0.00570 0.00626 0.00639 0.00633 0.00616 0.00658 0.00597 0.00612 0.00546 0.00660 0.00630 0.00577
U U U U U U U U U U U U U U E E E E E E E E E E E E E E E E E E E E O O O O O O O O O O O O O O O O O O O O
Yes Yes Yes Yes Yes Yes Yes Yes Yes Yes Yes Yes Yes Yes Yes Yes Yes Yes Yes Yes Yes Yes Yes Yes Yes Yes Yes Yes Yes Yes Yes Yes Yes Yes Yes Yes Yes Yes Yes Yes Yes Yes Yes Yes Yes Yes Yes Yes Yes Yes Yes Yes Yes Yes
Lampiran C.2. Data Simulasi Hasil Terbaik Sample2 SampleFile Num of Samples Regions Sample Varians TargetChar(s) InitVal Ranges Learn Rates Momentum Max ErrorLevel Epoch Last ErrorLevel MatchLevel Num Of Matched No 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45
Target Char a a a a a a a a a a a a a a a a a a a a i i i i i i i i i i i i i i i i i i i i u u u u u
Target Data 100100 100100 100100 100100 100100 100100 100100 100100 100100 100100 100100 100100 100100 100100 100100 100100 100100 100100 100100 100100 101100 101100 101100 101100 101100 101100 101100 101100 101100 101100 101100 101100 101100 101100 101100 101100 101100 101100 101100 101100 111000 111000 111000 111000 111000
: : : : : : : : : : : : :
Sample2.spl 100 5*4 5 [a,i,u,e,o] -2 to 2 .2 .5 600 100 12.19814 100% 100 of 100
Out1
Out2
0.99451 0.99479 0.99374 0.99408 0.99340 0.99396 0.99464 0.99350 0.99349 0.99366 0.99363 0.99369 0.99390 0.99326 0.99419 0.99340 0.99445 0.99347 0.99375 0.99407 0.98602 0.99437 0.98553 0.99482 0.98334 0.98504 0.99313 0.98490 0.99398 0.99547 0.98839 0.98534 0.98580 0.98563 0.98781 0.98770 0.98364 0.99155 0.99284 0.98380 0.98858 0.99018 0.98859 0.98784 0.98866
0.00425 0.00444 0.00251 0.01001 0.00845 0.00267 0.00284 0.00779 0.00717 0.00586 0.00815 0.00613 0.00407 0.00861 0.00408 0.00691 0.00448 0.00735 0.00362 0.00332 0.11934 0.01978 0.07813 0.02043 0.05028 0.03473 0.02747 0.03709 0.02208 0.01167 0.03815 0.06669 0.04325 0.02370 0.09297 0.03151 0.02148 0.06287 0.04553 0.05629 0.67829 0.60532 0.69656 0.66579 0.65654
OutData Out3 Out4 0.07321 0.08082 0.03987 0.16092 0.12542 0.04458 0.04950 0.11884 0.10858 0.09209 0.12281 0.09550 0.06344 0.12986 0.06437 0.10741 0.07558 0.10636 0.05549 0.05463 0.97309 0.82493 0.95982 0.81327 0.93572 0.90953 0.70546 0.91737 0.85675 0.74911 0.90605 0.95370 0.91976 0.87717 0.95656 0.91954 0.86438 0.94607 0.91364 0.94272 0.97681 0.97356 0.97819 0.97488 0.97389
82
0.77130 0.76483 0.83610 0.68725 0.71684 0.82670 0.80792 0.73221 0.73284 0.76028 0.72137 0.75266 0.78415 0.73021 0.77170 0.75050 0.76879 0.72931 0.80022 0.80687 0.62483 0.68686 0.70744 0.66514 0.78630 0.80698 0.60533 0.80212 0.69464 0.71935 0.73652 0.73695 0.75884 0.83702 0.60510 0.80401 0.86398 0.63468 0.62571 0.76771 0.17659 0.19995 0.16613 0.18526 0.17854
Out5
Out6
Out Char
Match
0.00015 0.00014 0.00016 0.00018 0.00018 0.00017 0.00014 0.00018 0.00017 0.00017 0.00017 0.00017 0.00015 0.00019 0.00015 0.00019 0.00015 0.00017 0.00016 0.00016 0.00087 0.00033 0.00095 0.00030 0.00120 0.00104 0.00037 0.00118 0.00036 0.00027 0.00073 0.00098 0.00102 0.00109 0.00073 0.00105 0.00129 0.00057 0.00045 0.00117 0.00066 0.00059 0.00066 0.00070 0.00065
0.00542 0.00534 0.00476 0.00669 0.00717 0.00461 0.00490 0.00636 0.00689 0.00595 0.00670 0.00608 0.00573 0.00647 0.00563 0.00609 0.00560 0.00682 0.00550 0.00505 0.00515 0.00598 0.00386 0.00661 0.00320 0.00292 0.01059 0.00321 0.00543 0.00557 0.00458 0.00346 0.00417 0.00263 0.00657 0.00289 0.00233 0.00510 0.00571 0.00348 0.02577 0.02225 0.02760 0.02418 0.02589
a a a a a a a a a a a a a a a a a a a a i i i i i i i i i i i i i i i i i i i i u u u u u
Yes Yes Yes Yes Yes Yes Yes Yes Yes Yes Yes Yes Yes Yes Yes Yes Yes Yes Yes Yes Yes Yes Yes Yes Yes Yes Yes Yes Yes Yes Yes Yes Yes Yes Yes Yes Yes Yes Yes Yes Yes Yes Yes Yes Yes
No
Target Char
46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100
u u u u u u u u u u u u u u u e e e e e e e e e e e e e e e e e e e e o o o o o o o o o o o o o o o o o o o o
Target Data 111000 111000 111000 111000 111000 111000 111000 111000 111000 111000 111000 111000 111000 111000 111000 101000 101000 101000 101000 101000 101000 101000 101000 101000 101000 101000 101000 101000 101000 101000 101000 101000 101000 101000 101000 110010 110010 110010 110010 110010 110010 110010 110010 110010 110010 110010 110010 110010 110010 110010 110010 110010 110010 110010 110010
Out1
Out2
0.98849 0.98868 0.98905 0.98960 0.99023 0.98913 0.98972 0.98920 0.98921 0.98894 0.98942 0.98866 0.98918 0.98935 0.98876 0.99087 0.99242 0.99118 0.99108 0.99094 0.99047 0.99235 0.99332 0.99090 0.99055 0.99004 0.99187 0.99167 0.99109 0.99196 0.99069 0.99047 0.99078 0.99132 0.99197 0.99358 0.98942 0.98706 0.98794 0.99258 0.98845 0.98934 0.98778 0.99165 0.99187 0.98993 0.99096 0.99308 0.99123 0.99232 0.98814 0.99283 0.99081 0.98773 0.99041
0.64773 0.65988 0.65270 0.57580 0.54594 0.57816 0.58881 0.62953 0.62102 0.65508 0.61184 0.64523 0.60566 0.61878 0.66995 0.25031 0.20664 0.46657 0.46427 0.39948 0.19154 0.29740 0.35061 0.43373 0.47085 0.38952 0.27314 0.46704 0.44342 0.14183 0.45666 0.48632 0.36444 0.38065 0.27184 0.67553 0.73172 0.73781 0.73101 0.57709 0.73584 0.71773 0.73707 0.71967 0.70579 0.72961 0.72638 0.69260 0.71348 0.67196 0.76057 0.71539 0.73705 0.74711 0.70668
OutData Out3 Out4 0.97318 0.97456 0.97438 0.96619 0.96299 0.96326 0.96795 0.97179 0.97119 0.97414 0.97060 0.97326 0.96976 0.97071 0.97614 0.91580 0.92201 0.95489 0.95890 0.94202 0.93400 0.94368 0.94787 0.95693 0.96168 0.94360 0.93563 0.95807 0.95817 0.91449 0.95625 0.96109 0.92703 0.94131 0.92116 0.30711 0.21766 0.19292 0.21224 0.46053 0.20430 0.23351 0.19992 0.25034 0.27493 0.22177 0.23005 0.29333 0.25778 0.32211 0.17263 0.25014 0.21338 0.18777 0.25618
83
0.18867 0.17978 0.17860 0.20790 0.20407 0.20097 0.19692 0.18419 0.19096 0.17780 0.19571 0.18694 0.20309 0.18752 0.17713 0.36820 0.33511 0.23156 0.23797 0.28052 0.41227 0.30224 0.27801 0.24425 0.23800 0.28904 0.30439 0.23432 0.24449 0.40998 0.24523 0.23116 0.28689 0.26828 0.30869 0.00695 0.01128 0.01597 0.00800 0.01361 0.01132 0.01132 0.01550 0.00851 0.00930 0.00828 0.00810 0.00702 0.00519 0.00849 0.01194 0.00827 0.00822 0.01116 0.00908
Out5
Out6
Out Char
Match
0.00065 0.00064 0.00063 0.00059 0.00056 0.00059 0.00059 0.00062 0.00062 0.00064 0.00061 0.00065 0.00062 0.00061 0.00065 0.00054 0.00043 0.00052 0.00052 0.00054 0.00059 0.00048 0.00043 0.00053 0.00056 0.00056 0.00047 0.00051 0.00053 0.00049 0.00055 0.00055 0.00048 0.00051 0.00045 0.97952 0.91369 0.81852 0.91490 0.85435 0.90238 0.89890 0.86326 0.95350 0.94803 0.94018 0.94721 0.97379 0.97042 0.95371 0.88994 0.97161 0.95471 0.88390 0.94456
0.02431 0.02548 0.02527 0.02244 0.02177 0.02455 0.02312 0.02475 0.02361 0.02600 0.02358 0.02392 0.02260 0.02440 0.02620 0.01407 0.01823 0.02018 0.02041 0.01723 0.01287 0.01709 0.01549 0.02165 0.02074 0.01662 0.01887 0.01908 0.02012 0.01470 0.01979 0.02171 0.01725 0.01781 0.01707 0.01170 0.01436 0.01620 0.01631 0.01202 0.01532 0.01474 0.01530 0.01273 0.01236 0.01450 0.01373 0.01184 0.01375 0.01238 0.01550 0.01200 0.01377 0.01601 0.01385
u u u u u u u u u u u u u u u e e e e e e e e e e e e e e e e e e e e o o o o o o o o o o o o o o o o o o o o
Yes Yes Yes Yes Yes Yes Yes Yes Yes Yes Yes Yes Yes Yes Yes Yes Yes Yes Yes Yes Yes Yes Yes Yes Yes Yes Yes Yes Yes Yes Yes Yes Yes Yes Yes Yes Yes Yes Yes Yes Yes Yes Yes Yes Yes Yes Yes Yes Yes Yes Yes Yes Yes Yes Yes
Lampiran C.3. Data Simulasi Hasil Terbaik Sample3 SampleFile Num of Samples Regions Sample Varians TargetChar(s) InitVal Ranges Learn Rates Momentum Max ErrorLevel Epoch Last ErrorLevel MatchLevel Num Of Matched No 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45
Target Char 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 2 2 2 2 2 2 2 2 2 2 3 3 3 3 3 3 3 3 3 3 4 4 4 4 4
Target Data 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000001 000001 000001 000001 000001 000001 000001 000001 000001 000001 000010 000010 000010 000010 000010 000010 000010 000010 000010 000010 000011 000011 000011 000011 000011 000011 000011 000011 000011 000011 000100 000100 000100 000100 000100
: : : : : : : : : : : : :
Sample3.spl 60 5*4 6 [0,1,2,3,4,5] -2 to 2 .2 .5 360 310 4.40524 100% 60 of 60
Out1
Out2
0.00017 0.00017 0.00007 0.00008 0.00017 0.00014 0.00010 0.00023 0.00014 0.00010 0.00007 0.00076 0.00017 0.00093 0.00051 0.00049 0.00014 0.00014 0.00119 0.00013 0.00002 0.00000 0.00001 0.00001 0.00003 0.00008 0.00005 0.00001 0.00003 0.00001 0.00016 0.00011 0.00021 0.00017 0.00020 0.00016 0.00016 0.00013 0.00013 0.00013 0.00033 0.00026 0.00038 0.00031 0.00034
0.01092 0.01040 0.00581 0.00616 0.00913 0.00976 0.00699 0.01092 0.00926 0.00774 0.00074 0.00202 0.00118 0.00221 0.00134 0.00287 0.00117 0.00130 0.01557 0.00129 0.00058 0.00037 0.00048 0.00050 0.00072 0.00129 0.00074 0.00047 0.00066 0.00057 0.00150 0.00095 0.00153 0.00140 0.00174 0.00134 0.00151 0.00132 0.00131 0.00119 0.01724 0.01663 0.01732 0.01677 0.01630
OutData Out3 Out4 0.00062 0.00067 0.00045 0.00065 0.00099 0.00046 0.00046 0.00110 0.00052 0.00066 0.00492 0.01443 0.00722 0.01530 0.00566 0.00909 0.00647 0.00597 0.00189 0.00640 0.00131 0.00075 0.00097 0.00107 0.00190 0.00206 0.00218 0.00093 0.00185 0.00110 0.01456 0.00857 0.01511 0.01531 0.01446 0.00933 0.01411 0.01089 0.01033 0.01243 0.00328 0.00289 0.00348 0.00294 0.00334
84
0.13810 0.14381 0.05766 0.07969 0.17368 0.10275 0.08201 0.18614 0.10779 0.09707 0.08825 0.26866 0.16621 0.30368 0.19284 0.29551 0.13605 0.17278 0.47816 0.12560 0.00952 0.00499 0.00697 0.00771 0.01557 0.03164 0.02256 0.00668 0.01596 0.00883 0.14472 0.10751 0.16581 0.15377 0.16947 0.13578 0.14534 0.11282 0.10562 0.12546 0.83668 0.80910 0.84534 0.82295 0.82581
Out5
Out6
Out Char
Match
0.12474 0.10962 0.22379 0.22685 0.13794 0.14264 0.11900 0.18029 0.12390 0.19183 0.09938 0.35186 0.08957 0.31136 0.18858 0.18171 0.15083 0.05425 0.11689 0.21508 0.89764 0.82605 0.85433 0.87222 0.88777 0.82382 0.85519 0.86029 0.87086 0.85962 0.79645 0.50012 0.72673 0.75067 0.75527 0.72604 0.78167 0.78256 0.79453 0.75799 0.06126 0.07396 0.05815 0.08072 0.08093
0.05277 0.07188 0.01724 0.03047 0.10926 0.02696 0.03540 0.14528 0.04055 0.04147 0.87657 0.98542 0.95942 0.98978 0.96093 0.96753 0.91403 0.95395 0.64352 0.87656 0.01345 0.00366 0.00663 0.00827 0.04017 0.07955 0.09743 0.00548 0.04951 0.00976 0.84881 0.82100 0.90819 0.88604 0.87626 0.80278 0.84722 0.77154 0.74458 0.83210 0.13406 0.08556 0.17089 0.09615 0.12448
0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 2 2 2 2 2 2 2 2 2 2 3 3 3 3 3 3 3 3 3 3 4 4 4 4 4
Yes Yes Yes Yes Yes Yes Yes Yes Yes Yes Yes Yes Yes Yes Yes Yes Yes Yes Yes Yes Yes Yes Yes Yes Yes Yes Yes Yes Yes Yes Yes Yes Yes Yes Yes Yes Yes Yes Yes Yes Yes Yes Yes Yes Yes
No 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60
Target Char 4 4 4 4 4 5 5 5 5 5 5 5 5 5 5
Target Data 000100 000100 000100 000100 000100 000101 000101 000101 000101 000101 000101 000101 000101 000101 000101
Out1
Out2
0.00029 0.00031 0.00028 0.00019 0.00018 0.00458 0.00285 0.00446 0.00434 0.00415 0.00459 0.00475 0.00410 0.00357 0.00465
0.01782 0.01677 0.01643 0.01424 0.01375 0.03263 0.01970 0.03102 0.02028 0.03053 0.02786 0.02492 0.03002 0.02621 0.01738
OutData Out3 Out4 0.00297 0.00317 0.00306 0.00183 0.00164 0.00987 0.01112 0.01019 0.01258 0.01011 0.01089 0.01142 0.00967 0.00895 0.01387
85
0.81854 0.83356 0.80669 0.74345 0.73232 0.79350 0.71650 0.79166 0.74878 0.78489 0.78059 0.77565 0.78115 0.74648 0.74059
Out5
Out6
Out Char
Match
0.08870 0.05532 0.08391 0.08453 0.09239 0.10538 0.16090 0.10425 0.14396 0.11285 0.11675 0.11254 0.10180 0.10995 0.13578
0.08128 0.13106 0.09181 0.03547 0.03010 0.98520 0.98041 0.98580 0.98884 0.98403 0.98722 0.98945 0.98391 0.98007 0.99224
4 4 4 4 4 5 5 5 5 5 5 5 5 5 5
Yes Yes Yes Yes Yes Yes Yes Yes Yes Yes Yes Yes Yes Yes Yes
Lampiran D.1. Listing Kode Program CharCognitron.dpr program CharCognitron; uses Forms, FrmCC in 'FrmCC.pas' {CCFrm}, GlobalSB in 'GlobalSB.pas', GlobalNN in 'GlobalNN.pas', FrmCT in 'FrmCT.pas' {CTForm}, FrmRep in 'FrmRep.pas' {RepFrm}; {$R *.res} begin Application.Initialize; Application.CreateForm(TCCFrm, CCFrm); Application.Run; end.
86
Lampiran D.2. Listing Kode Unit FrmCC.pas unit FrmCC; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, ToolWin, ActnMan, ActnCtrls, ActnMenus, ExtCtrls, ActnList, ComCtrls, Buttons, StdCtrls, Grids, DBGrids, StdActns, CustomizeDlg, ImgList, DB, ADODB, DBTables, jpeg, dxfOutlookBar, ValEdit, CheckLst, dxfCheckBox, dxfComboBox, StrUtils, dxfProgressBar, TeeProcs, TeEngine, Chart, Series, Menus, ExtDlgs, ClipBrd; type TCCFrm = class(TForm) {Bagian deklarasi sengaja tidak ditampilkan} end; var CCFrm: TCCFrm; FN : TFileName; implementation uses GlobalSB, GlobalNN, Math, FrmCT, FrmRep; {$R *.dfm} var Modified : Boolean; EditMode : Boolean; AppendMode : Boolean; HasChanged : Boolean; Cleared : Boolean; cBound, Bound : TRect; pxContainer : APoint; ActiveHidden : Integer;
function IsValidChar(vCH: Char): Boolean; begin Result := (vCH in ['A'..'Z','a'..'z','0'..'9','>','?']) end; procedure TCCFrm.UpdatePB; begin if not(FN='') then SFEdit.Text := ExtractFileName(FN); TCEdit.Text := aSample.TargetChar; SIEdit.Text := IntToStr(aSample.Id); NODEdit.Text := IntToStr(Length(aSample.Pixels)); PaintBox.Refresh; PanelDraw.Align := alNone; PaintBox.Align := alNone; PaintBox.BoundsRect := aSample.Bound; DimEdit.Text := IntToStr(PaintBox.BoundsRect.BottomPaintBox.BoundsRect.Top)+'x'+IntToStr(PaintBox.BoundsRect.RightPaintBox.BoundsRect.Top); PanelDraw.Top := (PanelNavi.ClientHeight-NaviBar.HeightPanelDraw.Height) div 2; PanelDraw.Left := (PanelNavi.ClientWidth-PanelDraw.Width) div 2;
87
PaintBox.Refresh; UpdateGrid end; procedure TCCFrm.SetCWEdit; var i : Integer; begin CWEdit.Strings.Clear; BiasEdit.Text := FloatToStr(Neurons.Hidden[ActiveHidden].Bias); for i := Low(Neurons.Hidden[ActiveHidden].InWeight) to High(Neurons.Hidden[ActiveHidden].InWeight) do CWEdit.Values['InNeuron '+IntToStr(Succ(i))] := FloatToStr(Neurons.Hidden[ActiveHidden].InWeight[i]); for i := Low(Neurons.Hidden[ActiveHidden].OutWeight) to High(Neurons.Hidden[ActiveHidden].OutWeight) do CWEdit.Values['OutNeuron '+IntToStr(Succ(i))] := FloatToStr(Neurons.Hidden[ActiveHidden].OutWeight[i]); for i := Low(Neurons.Output) to High(Neurons.Output) do BOutEdit.Values['OutNeuron '+IntToStr(Succ(i))] := FloatToStr(Neurons.Output[i]); end; procedure TCCFrm.SampleNewExecute(Sender: TObject); var vReg : TPoint; begin if not AskToDestroy then Exit; if not SG.IsEmpty then SampleCloseExecute(nil); FN := 'NewFile'; vReg := Point(StrToInt(RRowEdit.Text),StrToInt(RColEdit.Text)); NeuralNet.ActiveGroup := LearnGroup; SG.Init(vReg,CCTable); PanelNavi.Enabled := True; PanelDraw.Visible := True; Modified := False; SampleAddExecute(nil); end; procedure TCCFrm.SampleSaveExecute(Sender: TObject); begin {} end; procedure TCCFrm.SampleCloseExecute(Sender: TObject); begin if not AskToDestroy then Exit; SInput.Close; CCData.Connected := False; SG.Done; aSample.Init(cBound); SampleClearExecute(nil); PanelNavi.Enabled := False; PanelDraw.Visible := False; FN := ''; SFEdit.Text := 'no file loaded'; RRowEdit.Text := '5'; RColEdit.Text := '4'; EditMode := False; CleanUpNeurons; end; procedure TCCFrm.SampleAddExecute(Sender: TObject); begin if not AskToDestroy then Exit;
88
SampleClearExecute(nil); bSample.CopyFrom(aSample); aSample.Init(cBound); EditMode := True; AppendMode := True; HasChanged := False; UpdatePB; end; procedure TCCFrm.SampleRemoExecute(Sender: TObject); var vPos : Integer; Test : Boolean; begin if not AskToDestroy then Exit; vPos := SG.Pos(aSample); Test := SG.IsLast(aSample); SG.DelSample(aSample); if Test then aSample.CopyFrom(SG.Last) else aSample.CopyFrom(SG.Samples[vPos]); CCData.Close; SG.CalcData; UpdatePB end; procedure TCCFrm.SampleApplyExecute(Sender: TObject); var i,j : Integer; begin Cleared := False; EditMode := False; AppendMode := False; HasChanged := True; SetLength(pxContainer,0); for i := PaintBox.ClientRect.Left to PaintBox.ClientRect.Right do for j := PaintBox.ClientRect.Top to PaintBox.ClientRect.Bottom do if PaintBox.Canvas.Pixels[i,j]=clBlack then begin SetLength(pxContainer,Length(pxContainer)+1); pxContainer[Length(pxContainer)-1] := Point(i-Bound.Left,jBound.Top) end; aSample.AddData(TCEdit.Text[1],pxContainer,Bound); SG.AddSample(aSample); CCData.Close; SG.CalcData; SampleLastExecute(nil); end; procedure TCCFrm.SampleClearExecute(Sender: TObject); begin PaintBox.Align := alClient; PanelDraw.Align := alClient; Bound := cBound; PaintBox.Refresh; TCEdit.Text := ''; SIEdit.Text := ''; NODEdit.Text := ''; DimEdit.Text := ''; Cleared := False; end; procedure TCCFrm.SampleAbandonExecute(Sender: TObject);
89
begin if SG.IsEmpty then begin SampleCloseExecute(nil); Exit end; EditMode := False; aSample.CopyFrom(bSample); UpdatePB end; procedure TCCFrm.SampleFirstExecute(Sender: TObject); begin aSample.CopyFrom(SG.First); UpdatePB end; procedure TCCFrm.SampleLastExecute(Sender: TObject); begin aSample.CopyFrom(SG.Last); UpdatePB end; procedure TCCFrm.SamplePrevExecute(Sender: TObject); var vPos : Integer; begin vPos := SG.Pos(aSample); aSample.CopyFrom(SG.Samples[Pred(vPos)]); UpdatePB end; procedure TCCFrm.SampleNextExecute(Sender: TObject); var vPos : Integer; begin vPos := SG.Pos(aSample); aSample.CopyFrom(SG.Samples[Succ(vPos)]); UpdatePB end;
procedure TCCFrm.SampleLeftExecute(Sender: TObject); begin if not AskToDestroy then Exit; SG.MoveLeft(aSample); CCData.Close; SG.CalcData; UpdateGrid; end; procedure TCCFrm.SampleRightExecute(Sender: TObject); begin if not AskToDestroy then Exit; SG.MoveRight(aSample); CCData.Close; SG.CalcData; UpdateGrid; end; procedure TCCFrm.SampleLoadAccept(Sender: TObject); begin if not AskToDestroy then Exit; if not SG.IsEmpty then SampleCloseExecute(nil); FN := SampleLoad.Dialog.FileName;
90
NeuralNet.ActiveGroup := StructGroup; SG.LoadFromFile(FN,CCTable); PanelNavi.Enabled := True; PanelDraw.Visible := True; Modified := False; SampleFirstExecute(nil); end; procedure TCCFrm.SampleSaveAsAccept(Sender: TObject); begin FN := SampleSaveAs.Dialog.FileName; SFEdit.Text := FN; SG.SaveToFile(FN); Modified := False; end; procedure TCCFrm.ActionManagerUpdate(Action: TBasicAction; var Handled: Boolean); begin {Panel Toggle} ActionManager.ActionBars[1].Items[1].Visible := SampleSheet.TabVisible and (PageControl.ActivePage=SampleSheet); SamplesBar.Visible := (SampleSheet.TabVisible and (PageControl.ActivePage=SampleSheet)); NNSheet.TabVisible := not SG.IsEmpty; TASheet.TabVisible := (MatchLevel=100) or (CELEdit.Text=SCEEdit.Text); StructSheet.Visible := NeuralNet.ActiveGroup=StructGroup; LASheet.Visible := NeuralNet.ActiveGroup=LearnGroup; ActiveHidden := HiddenCombo.ItemIndex; PaintBox.Enabled := EditMode; RegionBox.Enabled := not(SG.IsEmpty); NeuralClear.Enabled := NeuronsOK; Logo.Visible := not SamplesBar.Visible; // BuildReports.Enabled := NeuronsExec; {File menu Toggle} FileClose.Enabled := SampleSheet.TabVisible; SampleClose.Enabled := PanelDraw.Visible; SampleSave.Enabled := (not SG.IsEmpty) and Modified; SampleSaveAs.Enabled := not SG.IsEmpty; {Navigate menu Toggle} NaviBar.Enabled := (not(SG.SampleLength=1)) and (not SG.IsEmpty) and (not EditMode); SampleFirst.Enabled := NaviBar.Enabled and (not SG.IsFirst(aSample)); SampleLast.Enabled := NaviBar.Enabled and (not SG.IsLast(aSample)); SamplePrev.Enabled := NaviBar.Enabled and (not SG.IsFirst(aSample)); SampleNext.Enabled := NaviBar.Enabled and (not SG.IsLast(aSample)); SampleLeft.Enabled := NaviBar.Enabled and (not SG.IsFirst(aSample)); SampleRight.Enabled := NaviBar.Enabled and (not SG.IsLast(aSample)); {Sample menu Toggle} SampleAdd.Enabled := not EditMode and (not SG.IsEmpty); SampleRemo.Enabled := not(SG.SampleLength=1) and (not EditMode) and (not SG.IsEmpty); SampleApply.Enabled := EditMode and HasChanged and (not(TCEdit.Text='')); SampleClear.Enabled := EditMode; SampleAbandon.Enabled := EditMode; {VCL properties Toggle} DataGrid.Visible := not SG.IsEmpty; TCEdit.Enabled := not(SG.IsEmpty) or EditMode; TCEdit.ReadOnly := not EditMode; TCEdit.TabStop := EditMode; SFEdit.ReadOnly := (Epoch>1); SpeedButton1.Enabled := not (Epoch>1); RRowEdit.ReadOnly := SG.IsEmpty or (Epoch>1); RColEdit.ReadOnly := SG.IsEmpty or (Epoch>1);
91
if EditMode then TCEdit.SetFocus; IndexEdit.Text := IntToStr(SG.Pos(aSample)+1); TotalEdit.Text := IntToStr(SG.SampleLength); end; procedure TCCFrm.PaintBoxPaint(Sender: TObject); var i : Integer; begin if (aSample.Pixels=nil) then Exit; for i := Low(aSample.Pixels) to High(aSample.Pixels) do PaintBox.Canvas.Pixels[aSample.Pixels[i].X,aSample.Pixels[i].Y] := clBlack; end; procedure TCCFrm.PaintBoxMouseMove(Sender: TObject; Shift: TShiftState; X, Y: Integer); begin if not EditMode then exit; if ssLeft in Shift then begin PaintBox.Canvas.LineTo(X,Y); if (XBound.Right) then Bound.Right := X+5; if (YBound.Bottom) then Bound.Bottom := Y+5 end end; procedure TCCFrm.PaintBoxMouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer); begin if not EditMode then exit; if (Button=mbLeft) then begin if not Cleared then begin Bound.TopLeft := Point(X,Y); Bound.BottomRight := Point(X,Y); Cleared := True end; HasChanged := True; PaintBox.Canvas.MoveTo(X,Y); PaintBox.Canvas.Pixels[X,Y] := PaintBox.Canvas.Pen.Color end end; procedure TCCFrm.TCEditChange(Sender: TObject); begin if not(TCEdit.Text='') then if not IsValidChar(TCEdit.Text[1]) then TCEdit.Text := ''; end; procedure TCCFrm.SFEditKeyPress(Sender: TObject; var Key: Char); var sr : TSearchRec; tFN : TFileName; begin
92
tFN := FN; if SFEdit.Modified and (Key=#13) then begin tFN := ExpandFileName(FN); if not(FindFirst(tFN,faAnyFile,sr)=0) then Exit; if not SG.IsEmpty then SampleCloseExecute(nil); FN := tFN; SG.LoadFromFile(FN,CCTable); PanelNavi.Enabled := True; PanelDraw.Visible := True; Modified := False; SampleFirstExecute(nil); UpdatePB end; end; procedure TCCFrm.SFEditChange(Sender: TObject); begin TEdit(Sender).Hint := TEdit(Sender).Text; FN := SFEdit.Text end; function TCCFrm.SQLNorm: String; var vStr : String; vLen, i : Integer; begin vLen := StrToInt(RRowEdit.Text)*StrToInt(RColEdit.Text); vStr := 'select Num, Id, Target'; for i := 1 to vLen do case SampleNorm.Checked of True : vStr := vStr+', Norm'+IntToStr(i); False : vStr := vStr+', In'+IntToStr(i); end; for i := 1 to 6 do vStr := vStr+', Out'+IntToStr(i); Result := vStr+' from '+SF; end; procedure TCCFrm.UpdateGrid; var i, vLen : Integer; S : String; begin if SG.IsEmpty then Exit; vLen := 8+(SG.Region.X*SG.Region.Y); if SG.IsEmpty then Exit; CCTable.Open; S := SQLNorm; SInput.SQL.Clear; SInput.SQL.Add(S); SInput.Open; SInput.Locate('Id',aSample.Id,[loCaseInsensitive]); DataGrid.Columns[1].Visible := False; with DataGrid do begin for i := 0 to Pred(vLen) do with Columns[i] do begin Title.Alignment := taCenter; if (Columns[i].Title.Caption='Target') then Alignment := taCenter; if not(i=0) then Width := 50
93
else Width := 30 end; end end; procedure TCCFrm.DataGridSelectCell(Sender: TObject; ACol, ARow: Integer; var CanSelect: Boolean); begin aSample.CopyFrom(SG.Samples[Pred(ARow)]); UpdatePB end; procedure TCCFrm.SampleNormExecute(Sender: TObject); begin UpdateGrid; end; procedure TCCFrm.FormCloseQuery(Sender: TObject; var CanClose: Boolean); begin SampleCloseExecute(nil); CanClose := not (Epoch>1); end; procedure TCCFrm.DataGridCellClick(Column: TColumn); var vPos : Integer; begin vPos := SInput.RecNo; aSample.CopyFrom(SG.Samples[Pred(vPos)]); UpdatePB; end; procedure TCCFrm.FormCreate(Sender: TObject); begin PaintBox.Canvas.Pen.Color := clBlack; PaintBox.ClientRect; cBound := PaintBox.BoundsRect; SampleSheet.TabVisible := False; NNSheet.TabVisible := False; // TASheet.TabVisible := False; StructSheet.TabVisible := False; LASheet.TabVisible := False; NeuralNet.ActiveGroup := StructGroup; Logo.Show; CCData.Params.Values['PATH'] := GetEnvironmentVariable('TEMP'); end; procedure TCCFrm.PageControlChanging(Sender: TObject; var AllowChange: Boolean); begin AllowChange := (not EditMode); if EditMode then MessageDlg('Please finish the sample editing first !',mtWarning,[mbOK],0); end; function TCCFrm.TestFloat(vStr: String):Boolean; var vFloat : Real; begin Result := True; vFloat := 0; try vFloat := StrToFloat(vStr)
94
except on E: EConvertError do begin ShowMessage(FloatToStr(vFloat)+E.ClassName+#10+E.Message); Result := False; end; end end; procedure TCCFrm.BiasEditExit(Sender: TObject); begin with (Sender as TEdit) do if not TestFloat(Text) then begin Text := '0'; SetFocus end; RandValExecute(nil); end; procedure TCCFrm.FileNewExecute(Sender: TObject); begin Logo.Visible := False; SampleSheet.TabVisible := True; NeuronsExist := False; NeuronsOK := False; Epoch := 0; end; procedure TCCFrm.FileCloseExecute(Sender: TObject); begin SampleCloseExecute(nil); if (Epoch>1) then Exit; SampleSheet.TabVisible := False; NNSheet.TabVisible := False; end; procedure TCCFrm.NeuralNetChangeActiveGroup(Sender: TObject); begin StructSheet.Visible := NeuralNet.ActiveGroup=StructGroup; LASheet.Visible := NeuralNet.ActiveGroup=LearnGroup; end; procedure TCCFrm.NNSheetShow(Sender: TObject); begin NeuralNet.ActiveGroup := StructGroup end; procedure TCCFrm.PageControlChange(Sender: TObject); var i : Integer; S : String; begin if not NeuronsExist then begin InitNeurons(StrToInt(REdit.Text)); SetCWEdit; end; if (PageControl.ActivePage=TASheet) then begin LCMemo.Clear; S := SG.Samples[0].TargetChar; for i := 1 to NumOfSamples-1 do begin
95
if not(SG.Samples[i].TargetChar=SG.Samples[i-1].TargetChar) then S := S+SG.Samples[i].TargetChar; end; LCMemo.Lines.Add('AIU'); IALabel.Caption := 'A'; end; end; procedure TCCFrm.RandValExecute(Sender: TObject); begin if not AskToDestroy then Exit; RandomNeurons(RndLo.Position,RndHi.Position); SetCWEdit; LearnSingleExecute(Self); end; procedure TCCFrm.NeuralClearExecute(Sender: TObject); begin if not AskToDestroy then Exit; ResetNeurons; NeuronsOK := False; SetCWEdit; end; procedure TCCFrm.HiddenComboChange(Sender: TObject); begin ActiveHidden := HiddenCombo.ItemIndex; CBHidden.Caption := 'HiddenNeuron '+IntToStr(ActiveHidden+1); if NeuronsExist then SetCWEdit; end; procedure TCCFrm.NeuralNetBeforeChangeActiveGroup(Sender: TObject; NewGroup: TdxfOutlookGroup; var AllowChange: Boolean); begin if not NeuronsOK and (PageControl.ActivePage=NNSheet) then MessageDlg('Initialize the Neurons first !',mtWarning,[mbOK],0); AllowChange := NeuronsOK or not SampleSheet.TabVisible; end; function TCCFrm.ABar(TagID: byte): TProgressBar; begin result := nil; case TagID of 1: result := T1Bar; 2: result := T2Bar; 3: result := T3Bar; 4: result := T4Bar; 5: result := T5Bar; 6: result := T6Bar; end; end; procedure TCCFrm.UpdateBar; var Level : array of Integer; sum : Extended; Ave, i,j : Integer; VBar : TProgressBar; begin Ave := 0; SetLength(Level,NumOfOutput); for i := 0 to NumOfOutput-1 do begin
96
sum := 0; for j := 1 to NumOfSamples do begin CCTable.RecNo := j; sum := sum+ABS(TempN.Output[i]CCTable.FieldValues['Out'+IntToStr(i+1)]); end; Level[i] := Round(100*(1-sum/NumOfSamples)); vBar := ABar(i+1); vBar.Position := Level[i]; vBar.Hint := IntToStr(Level[i])+'%'; Ave := Ave+Level[i]; end; Ave := Ave div NumOfOutput; TBar.Position := Ave; TBar.Hint := IntToStr(Ave)+'%'; MatchLevel := GetMatchLevel; MBar.Position := Round(MatchLevel); MBar.Hint := 'MatchLevel='+IntToStr(MBar.Position)+'%'; end; procedure TCCFrm.LearnSingleExecute(Sender: TObject); var E : Extended; begin LearnRate := StrToFloat(LREdit.Text); Momentum := StrToFloat(MomenEdit.Text); E := StrToFloat(FormatFloat('0.00000',ErrorLevel)); if (Epoch=0) then begin ErrorChart.Clear; PSMemo.Clear; PSMemo.Lines.Add('Samples File : '+ExtractFileName(FN)); PSMemo.Lines.Add('Num Of Samples : '+IntToStr(SG.SampleLength)); PSMemo.Lines.Add('Regions : '+RRowEdit.Text+'*'+RColEdit.Text); PSMemo.Lines.Add('Max ErrorLevel : '+IntToStr(NumOfSamples*NumOfOutput)); end; PSMemo.Lines.Add('Epoch['+IntToStr(Epoch)+'] = '+FloatToStr(E)); ErrorChart.AddXY(Epoch,E); EpochEdit.Text := IntToStr(Epoch); CELEdit.Text := FloatToStr(E); UpdateBar; Inc(Epoch); end; procedure TCCFrm.LearnMultiExecute(Sender: TObject); var E : Extended; Counter : Integer; begin Refresh; LearnRate := StrToFloat(LREdit.Text); Momentum := StrToFloat(MomenEdit.Text); Counter := 1; AllProgress.Max := StrToInt(StepEdit.Text); AllProgress.Position := 0; AllProgress.Show; while (Counter<=StrToInt(StepEdit.Text)) do begin E := StrToFloat(FormatFloat('0.00000',ErrorLevel)); PSMemo.Lines.Add('Epoch['+IntToStr(Epoch)+'] = '+FloatToStr(E)); ErrorChart.AddXY(Epoch,E); ELChart.Update; EpochEdit.Text := IntToStr(Epoch); EpochEdit.Update;
97
CELEdit.Text := FloatToStr(E); CELEdit.Update; AllProgress.StepIt; Inc(Epoch); Inc(Counter); UpdateBar; if MCB.Checked and (MatchLevel=100) then begin AllProgress.Hide; PSMemo.Lines.Add('MatchLevel 100% has been reached at Epoch = '+IntToStr(Epoch-1)); // PSMemo.Lines.Add('Last ErrorLevel = '+FloatToStr(E)); MessageDlg('MatchLevel 100% reached.'#13#10'Networks is now in its top condition !',mtInformation,[mbOK],0); BuildReportsExecute(Self); Exit; end; if (E<=StrToFloat(SCEEdit.Text)) then begin AllProgress.Hide; PSMemo.Lines.Add('Stopping Criteria Error has been reached at Epoch = '+IntToStr(Epoch-1)); // PSMemo.Lines.Add('Last ErrorLevel = '+FloatToStr(E)); MessageDlg('SCE has been reached at Epoch = '+IntToStr(Epoch1),mtInformation,[mbOK],0); BuildReportsExecute(Self); Exit end; end; AllProgress.Hide; end; procedure TCCFrm.ModiNetExecute(Sender: TObject); var Msg : String; Ask : TModalResult; begin Msg := 'This will destroy existing Neural Network!'#13#10'Continue anyway ?'; if (Epoch>1) then begin Ask := MessageDlg(Msg,mtConfirmation,[mbYes,mbNo],0); if (Ask=mrNo) then Exit else CleanUpNeurons; end; end; procedure TCCFrm.SFEditClick(Sender: TObject); begin AskToDestroy end; procedure TCCFrm.RRowEditKeyPress(Sender: TObject; var Key: Char); var vX,vY : Integer; begin if (TEdit(Sender).Text='') then Exit; if (Key=#13) then begin vX := StrToInt(RColEdit.Text); vY := StrToInt(RRowEdit.Text); if (vX*vY>20) then begin
98
TEdit(Sender).Text := '1'; Exit; end; REdit.Text := IntToStr(vX*vY); if not SG.IsEmpty then begin CCData.Close; SG.CalcData(Point(vX,vY)); UpdateGrid; NeuralNet.ActiveGroup := StructGroup; InitNeurons(StrToInt(REdit.Text)); SetCWEdit; end; end; end; procedure TCCFrm.RRowEditEnter(Sender: TObject); begin if not AskToDestroy then DataGrid.SetFocus; end; procedure TCCFrm.CheckTargetExecute(Sender: TObject); begin CTForm := TCTForm.Create(self); CTForm.ShowModal; CTForm.Free; end; procedure TCCFrm.SaveToFile1Click(Sender: TObject); begin ELChart.CopyToClipboardBitmap; end; procedure TCCFrm.SaveToFile2Click(Sender: TObject); begin if SavePictureDialog.Execute then ELChart.SaveToBitmapFile(SavePictureDialog.FileName); end; procedure TCCFrm.BuildReportsExecute(Sender: TObject); begin RepFrm := TRepFrm.Create(Self); RepFrm.ShowModal; RepFrm.Free; end; procedure TCCFrm.ReportSaveAccept(Sender: TObject); var FName : TFileName; begin FName := ReportSave.Dialog.FileName; RepFrm.Memo1.Lines.SaveToFile(FName); PSMemo.Lines.SaveToFile('Epoch.TXT'); ELChart.SaveToBitmapFile('Chart.bmp'); end; procedure TCCFrm.FormClose(Sender: TObject; var Action: TCloseAction); begin DestroyNeurons; end; procedure TCCFrm.FullScreenClick(Sender: TObject); begin NeuralNet.Visible := not FullScreen.Checked;
99
Panel1.Visible := not FullScreen.Checked; Splitter1.Visible := not FullScreen.Checked; end; procedure TCCFrm.SpeedButton12Click(Sender: TObject); var PWR, i,j : Integer; vO : String; begin Cleared := False; SetLength(pxContainer,0); for i := TestBox.ClientRect.Left to TestBox.ClientRect.Right do for j := TestBox.ClientRect.Top to TestBox.ClientRect.Bottom do if TestBox.Canvas.Pixels[i,j]=clBlack then begin SetLength(pxContainer,Length(pxContainer)+1); pxContainer[Length(pxContainer)-1] := Point(i-Bound.Left,jBound.Top) end; TestSample.AddData(#0,pxContainer,Bound); TestSample.AcquireTest(SG.Region,InputNeurons); CalcTest; vO := ''; for i := 0 to NumOfOutput-1 do begin PWR := Round(TempN.Output[i]); vO := vO+IntToStr(PWR); end; IALabel.Caption := BinToChar(vO); end; procedure TCCFrm.SpeedButton11Click(Sender: TObject); begin TestBox.Align := alClient; // TestPanel.Align := alClient; Bound := cBound; TestBox.Refresh; end; procedure TCCFrm.TestBoxMouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer); begin if (Button=mbLeft) then begin if not Cleared then begin Bound.TopLeft := Point(X,Y); Bound.BottomRight := Point(X,Y); Cleared := True end; TestBox.Canvas.MoveTo(X,Y); TestBox.Canvas.Pixels[X,Y] := TestBox.Canvas.Pen.Color end end; procedure TCCFrm.TestBoxMouseMove(Sender: TObject; Shift: TShiftState; X, Y: Integer); begin if ssLeft in Shift then begin TestBox.Canvas.LineTo(X,Y); if (XBound.Right) then
100
Bound.Right := X+5; if (YBound.Bottom) then Bound.Bottom := Y+5 end end; procedure TCCFrm.SavetoFile3Click(Sender: TObject); begin if SaveDialog1.Execute then PSMemo.Lines.SaveToFile(SaveDialog1.FileName); end; procedure TCCFrm.CopytoClipBoard1Click(Sender: TObject); begin PSMemo.SelectAll; PSMemo.CopyToClipboard; end; procedure TCCFrm.RRowEditExit(Sender: TObject); var vKey : Char; begin vKey := #13; RRowEditKeyPress(Self,vKey); end; end.
101
Lampiran D.3. Listing Kode Unit GlobalSB.pas unit GlobalSB; interface uses DB,DBTables, Types, SysUtils, ExtCtrls, Graphics, Controls, Classes, Dialogs, ZLib, Math; type APoint = array of TPoint; TBiner = 0..1; TSample = object Id : Int64; TargetChar: Char; Pixels : APoint; Bound : TRect; Norm : array of Real; constructor Init(vBound: TRect); procedure AddData(vTC: Char; vPixels: APoint; vBound: TRect); procedure CopyFrom(vSample: TSample); procedure AcquireData(vReg: TPoint; var vTable: TTable); procedure AcquireTest(vReg: TPoint; var vIn: array of Extended); private vCCT : TTable; procedure CopyPixels(sPixels: APoint); procedure BuildOutput; function GetData(vReg,Factor: TPoint): Integer; function GetMax(vData: array of Integer): Integer; function Contained(vPoint: TPoint; vBound: TRect): Boolean; end; TSampleGroup = object Region : TPoint; Samples : array of TSample; constructor Init; overLoad; constructor Init(vReg: TPoint; var vTable: TTable); overLoad; procedure AddSample(vTC: Char; vPixels: APoint; vBound: TRect);overload; procedure AddSample(vSample: TSample);overload; procedure CopyFrom(vGroup: TSampleGroup); procedure DelSample(vSample: TSample); function IsEmpty: Boolean; function First: TSample; function Last: TSample; function Pos(vSample: TSample): Integer; function IsFirst(vSample: TSample): Boolean; function IsLast(vSample: TSample): Boolean; function SampleLength: Integer; function MoveLeft(vSample: TSample):Boolean; function MoveRight(vSample: TSample):Boolean; procedure SaveToFile(vFN: TFileName); procedure LoadFromFile(vFN: TFileName; var vTable: TTable); procedure CalcData(vReg: TPoint); overload; procedure CalcData; overload; destructor Done; private CCT : TTable; procedure BuildTable; end; function GetCode: Int64; function CharToBin(vChar: Char):String; function BinToChar(vBin: String): Char; function NumOfVarians: Integer;
102
const BinFactor : array[1..6] of Byte = (1,2,4,8,16,32); var TestSample, aSample, bSample : TSample; SG : TSampleGroup; SF, STarget : String; implementation uses Gauges, GlobalNN, FrmCC; function GetCode: Int64; var vYear, vMonth, vDay, vHour, vMin, vSec, vMSec : Word; sDate, sTime : String; begin DecodeDate(now,vYear,vMonth,vDay); sDate := IntToStr(vYear)+IntToStr(vMonth)+IntToStr(vDay); DecodeTime(now,vHour,vMin,vSec,vMSec); sTime := IntToStr(vHour)+IntToStr(vMin)+IntToStr(vSec)+IntToStr(vMSec); Result := StrToInt64(sDate+sTime); end; function CharToBin(vChar: Char): String; var i, vMod, vOrd : Integer; vS : String; begin vOrd := Ord(vChar); vS := ''; if vChar in ['0'..'9'] then Dec(vOrd,48); if vChar in ['A'..'Z'] then vOrd := vOrd-65+10; if vChar in ['a'..'z'] then vOrd := vOrd-97+36; vS := ''; repeat vMod := vOrd mod 2; vS := vS+IntToStr(vMod); vOrd := vOrd div 2; until vOrd=0; if not(Length(vS)=NumOfOutput) then for i := 1 to (NumOfOutput-Length(vS)) do vS := vS+'0'; Result := vS; end; function BinToChar(vBin: String): Char; var Sum, i : Integer; begin Sum := 0;
103
for i := Length(vBin) DownTo 1 do Sum := Sum+(StrToInt(vBin[i])*BinFactor[Length(vBin)-i+1]); if (Sum<10) then Inc(Sum,48) else if (Sum>=10) and (Sum<36) then Inc(Sum,55) else if (Sum>=36) then Inc(Sum,61); Result := Chr(Sum); end; function NumOfVarians: Integer; var counter, i : Integer; begin counter := 1; STarget := '['+SG.Samples[0].TargetChar; for i := 1 to NumOfSamples-1 do if not(SG.Samples[i].TargetChar=SG.Samples[i-1].TargetChar) then begin Inc(counter); STarget := STarget+','+SG.Samples[i].TargetChar; end; STarget := STarget+']'; Result := counter; end;
{Definition of TSample} constructor TSample.Init(vBound: TRect); begin {Initiate Pixels array} Id := 0; TargetChar := #0; Bound := vBound; Pixels := nil; end; procedure TSample.BuildOutput; var vOutput, i : Integer; vS : String; begin vS := CharToBin(TargetChar); for i := 1 to Length(vS) do begin vOutput := TBiner(vS[Length(vS)-Pred(i)])-48; vCCT.FieldByName('Out'+IntToStr(i)).AsInteger := vOutput; end end;{BuildOutput} function TSample.Contained(vPoint: TPoint; vBound: TRect): Boolean; begin Result := ((vPoint.X>=vBound.Left) and (vPoint.X<=vBound.Right)) and ((vPoint.Y>=vBound.Top) and (vPoint.y<=vBound.Bottom)); end;{Contained} procedure TSample.CopyPixels(sPixels: APoint); var vLen, i : Integer;
104
begin if (sPixels=nil) then Exit; vLen := Length(sPixels); SetLength(Pixels,vLen); for i := Low(Pixels) to High(Pixels) do begin Pixels[i].X := sPixels[i].X; Pixels[i].Y := sPixels[i].Y end end; function TSample.GetData(vReg,Factor: TPoint): Integer; var Start, Finish : TPoint; NumOfPixel, i : Integer; begin Start.X := (Pred(vReg.X)*Factor.X); Start.Y := (Pred(vReg.Y)*Factor.Y); Finish.X := vReg.X*Factor.X-1; Finish.Y := vReg.Y*Factor.Y-1; NumOfPixel := 0; for i := Low(Pixels) to High(Pixels) do if Contained(Pixels[i],Rect(Start,Finish)) then Inc(NumOfPixel); Result := NumOfPixel end;{GetData} function TSample.GetMax(vData: array of Integer): Integer; var vMax, i : Integer; begin vMax := 0; for i := Low(vData) to High(vData) do vMax := Max(vMax,vData[i]); Result := vMax end;{GetMax} procedure TSample.AddData(vTC: Char; vPixels: APoint; vBound: TRect); begin Id := GetCode; TargetChar := vTC; CopyPixels(vPixels); Bound := vBound; end;//AddData procedure TSample.CopyFrom(vSample: TSample); begin Id := vSample.Id; TargetChar := vSample.TargetChar; CopyPixels(vSample.Pixels); Bound := vSample.Bound end;{CopyFrom} procedure TSample.AcquireData(vReg: TPoint; var vTable: TTable); var vHeight,vWidth, vX,vY, Counter, vInput, vMax, vLen, i,j : Integer;
105
aInput : array of Integer; vNorm : Real; begin vCCT := vTable; vHeight := Bound.Bottom-Bound.Top; vWidth := Bound.Right-Bound.Left; vX := vWidth div vReg.X; vY := vHeight div vReg.Y; if not(vWidth mod vReg.X=0) then Inc(vX); if not(vHeight mod vReg.Y=0) then Inc(vY); with vCCT do try Append; vLen := SG.Pos(Self)+1; FieldByName('Num').AsInteger := vLen; FieldByName('Id').AsString := IntToStr(Id); FieldByName('Target').AsString := TargetChar; BuildOutput; Counter := 0; for i := 1 to vReg.Y do for j := 1 to vReg.X do begin Inc(Counter); vInput := GetData(Point(j,i),Point(vX,vY)); FieldByName('In'+IntToStr(Counter)).AsInteger := vInput; SetLength(aInput,Counter); aInput[Pred(Counter)] := vInput; end; vMax := GetMax(aInput); Counter := 0; for i := 1 to vReg.Y do for j := 1 to vReg.X do begin if (aInput[Counter]=0) then vNorm := 0 else vNorm := StrToFloat(FormatFloat('0.0000',(aInput[Counter]/vMax))); vCCT.FieldByName('Norm'+IntToStr(Succ(Counter))).AsFloat := vNorm; Inc(Counter); end finally Post end; end;{AcquireData} procedure TSample.AcquireTest(vReg: TPoint; var vIn: array of Extended); var vHeight,vWidth, vX,vY, Counter, vInput, vMax, i,j : Integer; aInput : array of Integer; vNorm : Real; begin vHeight := Bound.Bottom-Bound.Top; vWidth := Bound.Right-Bound.Left; vX := vWidth div vReg.X; vY := vHeight div vReg.Y; if not(vWidth mod vReg.X=0) then Inc(vX);
106
if not(vHeight mod vReg.Y=0) then Inc(vY); Counter := 0; for i := 1 to vReg.Y do for j := 1 to vReg.X do begin Inc(Counter); vInput := GetData(Point(j,i),Point(vX,vY)); SetLength(aInput,Counter); aInput[Pred(Counter)] := vInput; end; vMax := GetMax(aInput); Counter := 0; for i := 1 to vReg.Y do for j := 1 to vReg.X do begin if (aInput[Counter]=0) then vNorm := 0 else vNorm := StrToFloat(FormatFloat('0.0000',(aInput[Counter]/vMax))); vIn[Counter] := vNorm; Inc(Counter); end end;{AcquireTest} {Definition of TSampleGroup} constructor TSampleGroup.Init; begin Samples := nil; end; constructor TSampleGroup.Init(vReg: TPoint; var vTable: TTable); begin Region := vReg; CCT := vTable; Init end; procedure TSampleGroup.AddSample(vTC: Char; vPixels: APoint; vBound: TRect); var vLen : Integer; begin vLen := Length(Samples); SetLength(Samples,Succ(vLen)); Samples[High(Samples)].AddData(vTC,vPixels,vBound); end; procedure TSampleGroup.AddSample(vSample: TSample); var vLen : Integer; begin vLen := Length(Samples); SetLength(Samples,Succ(vLen)); Samples[High(Samples)].CopyFrom(vSample); end; procedure TSampleGroup.CopyFrom(vGroup: TSampleGroup); var vLen, i : Integer; begin vLen := vGroup.SampleLength;
107
if (vLen=0) then Exit; SetLength(Samples,vLen); for i := Low(Samples) to High(Samples) do Samples[i].CopyFrom(vGroup.Samples[i]) end; procedure TSampleGroup.DelSample(vSample: TSample); var i : Integer; tGroup : TSampleGroup; begin tGroup.Init; for i := Low(Samples) to High(Samples) do if not(Samples[i].Id=vSample.Id) then tGroup.AddSample(Samples[i]); Self.Samples := tGroup.Samples; end; function TSampleGroup.IsEmpty: Boolean; begin Result := (Samples=nil) end; function TSampleGroup.Pos(vSample: TSample): Integer; var i : Integer; begin Result := -1; for i := Low(Samples) to High(Samples) do if (Samples[i].Id = vSample.Id) then begin Result := i; Exit end end; function TSampleGroup.First: TSample; begin Result := Samples[Low(Samples)] end; function TSampleGroup.Last: TSample; begin Result := Samples[High(Samples)] end; function TSampleGroup.IsFirst(vSample: TSample): Boolean; begin Result := False; if not IsEmpty then Result := Samples[Low(Samples)].Id=vSample.Id end; function TSampleGroup.IsLast(vSample: TSample): Boolean; begin Result := False; if not IsEmpty then Result := Samples[High(Samples)].Id=vSample.Id end; function TSampleGroup.SampleLength: Integer; begin Result := Length(Samples) end;
108
function TSampleGroup.MoveLeft(vSample: TSample):Boolean; var lSample : TSample; i : Byte; begin Result := True; for i := Low(Samples) to High(Samples) do if Samples[i].Id=vSample.Id then begin if i=Low(Samples) then begin ShowMessage('Cannot MoveLeft The First Samples!'); Result := False; Exit end; lSample.CopyFrom(Samples[i]); Samples[i].CopyFrom(Samples[Pred(i)]); Samples[Pred(i)].CopyFrom(lSample); exit end; end; function TSampleGroup.MoveRight(vSample: TSample):Boolean; var rSample : TSample; i : Byte; begin Result := True; for i := Low(Samples) to High(Samples) do if Samples[i].Id=vSample.Id then begin if i=High(Samples) then begin ShowMessage('Cannot MoveRight The Last Samples!'); Result := False; Exit end; rSample.CopyFrom(Samples[i]); Samples[i].CopyFrom(Samples[Succ(i)]); Samples[Succ(i)].CopyFrom(rSample); exit end; end; procedure TSampleGroup.SaveToFile(vFN: TFileName); var vF : Text; i,j : Integer; begin AssignFile(vF,vFN); {$I-} Rewrite(vF); {$I+} WriteLn(vF,Region.X,' ',Region.Y); WriteLn(vF,SampleLength); for i := Low(Samples) to High(Samples) do with Samples[i] do begin WriteLn(vF,Id); WriteLn(vF,TargetChar); WriteLn(vF,Bound.Top,' ',Bound.Bottom,' ',Bound.Left,' ',Bound.Right,' '); WriteLn(vF,Length(Pixels)); for j := Low(Pixels) to High(Pixels) do Write(vF,Pixels[j].X,' ',Pixels[j].Y,' ');
109
WriteLn(vF); end; CloseFile(vF) end; procedure TSampleGroup.LoadFromFile(vFN: TFileName; var vTable: TTable); var vF : Text; NOS, NOP, i,j : Integer; begin AssignFile(vF,vFN); {$I-} Reset(vF); {$I+} ReadLn(vF,Region.X,Region.Y); ReadLn(vF,NOS); SetLength(Samples,NOS); for i := Low(Samples) to High(Samples) do with Samples[i] do begin ReadLn(vF,Id); ReadLn(vF,TargetChar); ReadLn(vF,Bound.Top,Bound.Bottom,Bound.Left,Bound.Right); ReadLn(vF,NOP); SetLength(Pixels,NOP); for j := Low(Pixels) to High(Pixels) do Read(vF,Pixels[j].X,Pixels[j].Y); ReadLn(vF); end; CloseFile(vF); CCT := vTable; CalcData(Region) end; procedure TSampleGroup.CalcData(vReg: TPoint); begin Region := vReg; CalcData; end; procedure TSampleGroup.CalcData; var i : Integer; begin BuildTable; CCT.Open; for i := Low(Samples) to High(Samples) do Samples[i].AcquireData(Region,CCT); end; procedure TSampleGroup.BuildTable; var vLen, Counter, i,j : Integer; begin SF := IntToStr(GetCode); vLen := Length(SF); SF := 'CC'+Copy(SF,vLen-6,6); with CCT dobegin Close; DatabaseName := 'CCData'; TableName := SF; if CCT.Exists then DeleteTable;
110
with FieldDefs do begin Clear; with AddFieldDef do begin Name := 'Num'; DataType := ftInteger; Required := True end; with AddFieldDef do begin Name := 'Id'; DataType := ftString; Required := True end; with AddFieldDef do begin Name := 'Target'; DataType := ftString; Required := True end; Counter := 0; for i := 1 to Region.Y do for j := 1 to Region.X do begin Inc(Counter); with AddFieldDef do begin Name := 'In'+IntToStr(Counter); DataType := ftInteger; Required := False end end; Counter := 0; for i := 1 to Region.Y do for j := 1 to Region.X do begin Inc(Counter); with AddFieldDef do begin Name := 'Norm'+IntToStr(Counter); DataType := ftFloat; Required := False end end; for i := 1 to 6 do with AddFieldDef do begin Name := 'Out'+IntToStr(i); DataType := ftInteger; Required := True end end; ObjectView := True; CreateTable end end; destructor TSampleGroup.Done; begin Samples := nil; Region := Point(0,0); if not (CCT=nil) and CCT.Exists then CCT.DeleteTable; end; end.
111
Lampiran D.4. Listing Kode Unit GlobalNN.pas unit GlobalNN; interface const NumOfOutput= 6; NumOfHidden = 10; type THidden=record Bias : Extended; InWeight : array of Extended; OutWeight : array of Extended; end; TNeurons=record Hidden : array of THidden; Output : array of Extended; end; TSens=record Hidden : array of Extended; Output : array of Extended; end; var TempN, Neurons : TNeurons; NeuronsExist, NeuronsOK : Boolean; MatchLevel, LearnRate, Momentum : Extended; ErrorSample : array of Extended; NumOfSamples, NumOfMatch, Epoch, NumOfInput : Integer; InputNeurons : array of Extended; TargetNeurons : array of Byte; procedure procedure procedure procedure procedure procedure procedure function function function procedure
InitNeurons(const NInput: Integer=20); RandomNeurons(Lo, Hi: Integer); ResetNeurons; CleanUpNeurons; DestroyNeurons; CalcSample(SampleNo: Integer); CalcTest; ErrorLevel: Extended; GetMatchLevel: Real; AskToDestroy: Boolean; ClearError;
implementation uses SysUtils, Math, GlobalSB, FrmCC, Controls, Dialogs, DB; var Delta Sens LDIW, DeltaInWeight LDOW, DeltaOutWeight
: array of TNeurons; : TSens; : array of array of Extended; : array of array of Extended;
112
LDBH, DeltaBiasHid LDBO, DeltaBiasOut
: array of Extended; : array of Extended;
function AskToDestroy: Boolean; var Msg : String; Ask : TModalResult; begin Result := True; Msg := 'This Will DESTROY the existing Neural Networks !!!'#13#10'Continue anyway ?'; if (Epoch>1) then begin Ask := MessageDlg(Msg,mtConfirmation,[mbYes,mbNo],0); if (Ask=mrNo) then Result := False else begin CCFrm.NeuralNet.ActiveGroup := CCFrm.StructGroup; Epoch := 0; CleanUpNeurons; Result := True; end end end; function GetMatchLevel: Real; var PWR, i,j : Integer; vO : String; begin NumOfMatch := 0; for i := 0 to NumOfSamples-1 do begin CalcSample(i); vO := ''; for j := 0 to NumOfOutput-1 do begin PWR := Round(TempN.Output[j]); vO := vO+IntToStr(PWR); end; if (SG.Samples[i].TargetChar=BinToChar(vO)) then Inc(NumOfMatch); end; Result := (NumOfMatch/NumOfSamples)*100; end; function RandFloat(vLo, vHi: Integer): Extended; var vRand : Extended; begin repeat vRand := StrToFloat(FormatFloat('0.00000',RandomRange(vLo,vHi+1)*Random)) until not IsZero(vRand); result := vRand end; function Sigmoid(X: Extended): Extended; begin result := 1/(1+exp(-1*X)); end;
113
procedure CreateNeurons(var vNeurons: TNeurons); var i,j : Integer; begin SetLength(vNeurons.Hidden,NumOfHidden); for i := 0 to NumOfHidden-1 do begin vNeurons.Hidden[i].Bias := 0; SetLength(vNeurons.Hidden[i].InWeight,NumOfInput); for j := 0 to NumOfInput-1 do vNeurons.Hidden[i].InWeight[j] := 0; SetLength(vNeurons.Hidden[i].OutWeight,NumOfOutput); for j := 0 to NumOfOutput-1 do vNeurons.Hidden[i].OutWeight[j] := 0; end; SetLength(vNeurons.Output,NumOfOutput); for i := 0 to NumOfOutput-1 do vNeurons.Output[i] := 0; SetLength(LDIW,NumOfInput); for i := 0 to NumOfInput-1 do begin SetLength(LDIW[i],NumOfHidden); for j := 0 to NumOfHidden-1 do LDIW[i,j] := 0; end; SetLength(LDOW,NumOfOutput); for i := 0 to NumOfOutput-1 do begin SetLength(LDOW[i],NumOfHidden); for j := 0 to NumOfHidden-1 do LDOW[i,j] := 0; end; SetLength(LDBH,NumOfHidden); for i := 0 to NumOfHidden-1 do LDBH[i] := 0; SetLength(LDBO,NumOfOutput); for i := 0 to NumOfOutput-1 do LDBO[i] := 0; end; procedure InitNeurons(const NInput: Integer=20); var i : Integer; begin Randomize; NumOfInput := NInput; NumOfSamples := SG.SampleLength; ResetNeurons; ClearError; SetLength(ErrorSample,NumOfOutput); for i := 0 to NumOfOutput-1 do ErrorSample[i] := 0; NeuronsExist := True; NeuronsOK := False; end; procedure Flush; var i,j : Integer; begin CreateNeurons(TempN); SetLength(Sens.Hidden,NumOfHidden); for i := 0 to NumOfHidden-1 do Sens.Hidden[i] := 0;
114
SetLength(Sens.Output,NumOfOutput); for i := 0 to NumOfOutput-1 do Sens.Output[i] := 0; SetLength(InputNeurons,NumOfInput); for i := 0 to NumOfInput-1 do InputNeurons[i] := 0; SetLength(TargetNeurons,NumOfOutput); for i := 0 to NumOfOutput-1 do TargetNeurons[i] := 0; SetLength(DeltaInWeight,NumOfInput); for i := 0 to NumOfInput-1 do begin SetLength(DeltaInWeight[i],NumOfHidden); for j := 0 to NumOfHidden-1 do DeltaInWeight[i,j] := 0; end; SetLength(DeltaOutWeight,NumOfOutput); for i := 0 to NumOfOutput-1 do begin SetLength(DeltaOutWeight[i],NumOfHidden); for j := 0 to NumOfHidden-1 do DeltaOutWeight[i,j] := 0; end; SetLength(DeltaBiasHid,NumOfHidden); for i := 0 to NumOfHidden-1 do DeltaBiasHid[i] := 0; SetLength(DeltaBiasOut,NumOfOutput); for i := 0 to NumOfOutput-1 do DeltaBiasOut[i] := 0; end; procedure ResetNeurons; begin CreateNeurons(Neurons); Epoch := 0; Flush; NeuronsOK := False; end; procedure RandomNeurons(Lo, Hi: Integer); var i,j : Integer; begin ResetNeurons; for i := Low(Neurons.Hidden) to High(Neurons.Hidden) do begin Neurons.Hidden[i].Bias := RandFloat(Lo,Hi); for j := Low(Neurons.Hidden[i].InWeight) to High(Neurons.Hidden[i].InWeight) do Neurons.Hidden[i].InWeight[j] := RandFloat(Lo,Hi); for j := Low(Neurons.Hidden[i].OutWeight) to High(Neurons.Hidden[i].OutWeight) do Neurons.Hidden[i].OutWeight[j] := RandFloat(Lo,Hi) end; for i := Low(Neurons.Output) to High(Neurons.Output) do Neurons.Output[i] := RandFloat(Lo,Hi); NeuronsOK := True; end; procedure GetInputTarget(SampleNo: Integer); var i : Integer; begin // CCFrm.CCTable.Locate('Num',SampleNo+1,[loCaseInsensitive]); CCFrm.CCTable.RecNo := SampleNo+1;
115
for i := 0 to NumOfInput-1 do InputNeurons[i] := CCFrm.CCTable.FieldValues['Norm'+IntToStr(i+1)]; for i := 0 to NumOfOutput-1 do TargetNeurons[i] := CCFrm.CCTable.FieldValues['Out'+IntToStr(i+1)]; end; procedure ClearError; var i : Integer; begin SetLength(ErrorSample,NumOfOutput); for i := 0 to NumOfOutput-1 do ErrorSample[i] := 0; SetLength(Delta,NumOfSamples); for i := 0 to NumOfSamples-1 do CreateNeurons(Delta[i]); end; procedure CalcSample(SampleNo: Integer); var i,j : Integer; sum : Extended; begin Flush; GetInputTarget(SampleNo); {Calculating intermediate HiddenNeurons Bias} for i := 0 to NumOfHidden-1 do begin sum := 0; for j := 0 to NumOfInput-1 do sum := sum+(Neurons.Hidden[i].InWeight[j]*InputNeurons[j]); TempN.Hidden[i].Bias := Sigmoid(sum+Neurons.Hidden[i].Bias); end; {Calculating intermediate OutputNeurons Bias} for i := 0 to NumOfOutput-1 do begin sum := 0; for j := 0 to NumOfHidden-1 do sum := sum+(TempN.Hidden[j].Bias*Neurons.Hidden[j].OutWeight[i]); TempN.Output[i] := Sigmoid(sum+Neurons.Output[i]); end; {Calculating ErrorSample} for i := 0 to NumOfOutput-1 do ErrorSample[i] := ErrorSample[i]+SQR(TempN.Output[i]TargetNeurons[i]); {Calculating Sensitivity} for i := 0 to NumOfOutput-1 do Sens.Output[i] := (1TempN.Output[i])*TempN.Output[i]*(TargetNeurons[i]-TempN.Output[i]); for i := 0 to NumOfHidden-1 do begin sum := 0; for j := 0 to NumOfOutput-1 do sum := sum+Sens.Output[j]*Neurons.Hidden[i].OutWeight[j]; Sens.Hidden[i] := (1TempN.Hidden[i].Bias)*TempN.Hidden[i].Bias*sum; end; {Calculating Delta HiddenOutWeight} for i := 0 to NumOfHidden-1 do for j := 0 to NumOfOutput-1 do Delta[SampleNo].Hidden[i].OutWeight[j] := LearnRate*Sens.Output[j]*TempN.Hidden[i].Bias; {Calculating Delta HiddenInWeight} for i := 0 to NumOfOutput-1 do for j := 0 to NumOfInput-1 do
116
Delta[SampleNo].Hidden[i].InWeight[j] := LearnRate*Sens.Hidden[i]*InputNeurons[j]; {Calculating Delta Bias Output} for i := 0 to NumOfOutput-1 do Delta[SampleNo].Output[i] := LearnRate*Sens.Output[i]; {Calculating Delta Bias Hidden} for i := 0 to NumOfHidden-1 do Delta[SampleNo].Hidden[i].Bias := LearnRate*Sens.Hidden[i]; end;{CalcSample} procedure CalcTest; var i,j : Integer; sum : Extended; begin Flush; {Calculating intermediate HiddenNeurons Bias} for i := 0 to NumOfHidden-1 do begin sum := 0; for j := 0 to NumOfInput-1 do sum := sum+(Neurons.Hidden[i].InWeight[j]*InputNeurons[j]); TempN.Hidden[i].Bias := Sigmoid(sum+Neurons.Hidden[i].Bias); end; {Calculating intermediate OutputNeurons Bias} for i := 0 to NumOfOutput-1 do begin sum := 0; for j := 0 to NumOfHidden-1 do sum := sum+(TempN.Hidden[j].Bias*Neurons.Hidden[j].OutWeight[i]); TempN.Output[i] := Sigmoid(sum+Neurons.Output[i]); end; end;{CalcTest} function ErrorLevel: Extended; var s, i,j : Integer; sum : Extended; begin ClearError; for s := 0 to NumOfSamples-1 do CalcSample(s); {Sum Delta HiddenOutWeight} for i := 0 to NumOfOutput-1 do for j := 0 to NumOfHidden-1 do begin sum := 0; for s := 0 to NumOfSamples-1 do sum := sum+Delta[s].Hidden[i].OutWeight[i]; DeltaOutWeight[i,j] := sum end; {Sum Delta HiddenInWeight} for i := 0 to NumOfInput-1 do for j := 0 to NumOfHidden-1 do begin sum := 0; for s := 0 to NumOfSamples-1 do sum := sum+Delta[s].Hidden[j].InWeight[i]; DeltaInWeight[i,j] := sum end; {Sum Delta Bias Output} for i := 0 to NumOfOutput-1 do
117
begin sum := 0; for s := 0 to NumOfSamples-1 do sum := sum+Delta[s].Output[i]; DeltaBiasOut[i] := sum; end; {Sum Delta Bias Hidden} for i := 0 to NumOfHidden-1 do begin sum := 0; for s := 0 to NumOfSamples-1 do sum := sum+Delta[s].Hidden[i].Bias; DeltaBiasHid[i] := sum end; {Update Neurons HiddenOutWeight} for i := 0 to NumOfOutput-1 do for j := 0 to NumOfHidden-1 do Neurons.Hidden[j].OutWeight[i] := Neurons.Hidden[j].OutWeight[i]+DeltaOutWeight[i,j]+(Momentum*LDOW[i,j]); {Update Neurons HiddenInWeight} for i := 0 to NumOfInput-1 do for j := 0 to NumOfHidden-1 do Neurons.Hidden[j].InWeight[i] := Neurons.Hidden[j].InWeight[i]+DeltaInWeight[i,j]+(Momentum*LDIW[i,j]); {Update Neurons Bias Output} for i := 0 to NumOfOutput-1 do Neurons.Output[i] := Neurons.Output[i]+DeltaBiasOut[i]+(Momentum*LDBO[i]); {Update Neurons Bias Hidden} for i := 0 to NumOfHidden-1 do Neurons.Hidden[i].Bias := Neurons.Hidden[i].Bias+DeltaBiasHid[i]+(Momentum*LDBH[i]); {Sum ErrorSample} sum := 0; for s := 0 to NumOfOutput-1 do sum := sum+ErrorSample[s]; Result := sum; {Save Last Delta Values for next Iteration} for i := 0 to NumOfOutput-1 do for j := 0 to NumOfHidden-1 do LDOW[i,j] := DeltaOutWeight[i,j]; for i := 0 to NumOfInput-1 do for j := 0 to NumOfHidden-1 do LDIW[i,j] := DeltaInWeight[i,j]; for i := 0 to NumOfOutput-1 do LDBO[i] := DeltaBiasOut[i]; for i := 0 to NumOfHidden-1 do LDBH[i] := DeltaBiasHid[i]; end; procedure CleanUpNeurons; begin Epoch := 0; SetLength(Neurons.Hidden,0); SetLength(Neurons.Output,0); NeuronsExist := False; NeuronsOK := False; end; procedure DestroyNeurons; begin CleanUpNeurons; SetLength(Delta,0); SetLength(DeltaBiasHid,0); SetLength(DeltaBiasOut,0);
118
SetLength(DeltaInWeight,0); SetLength(DeltaOutWeight,0); SetLength(ErrorSample,0); SetLength(InputNeurons,0); SetLength(LDBH,0); SetLength(LDBO,0); SetLength(LDIW,0); SetLength(LDOW,0); SetLength(TempN.Hidden,0); SetLength(TempN.Output,0); SetLength(TargetNeurons,0); end; end.
119
Lampiran D.5. Listing Kode Unit FrmCT.pas unit FrmCT; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, ToolWin, ActnMan, ActnCtrls, Buttons, ExtCtrls, ComCtrls; type TCTForm = class(TForm) CTMemo: TMemo; ControlBar1: TControlBar; ToolBar1: TToolBar; Panel1: TPanel; SFEdit: TLabeledEdit; NOSEdit: TLabeledEdit; SNOEdit: TLabeledEdit; IDEdit: TLabeledEdit; UDSNo: TUpDown; TCEdit: TLabeledEdit; IAEdit: TLabeledEdit; ToolButton1: TToolButton; procedure FormShow(Sender: TObject); procedure SNOEditChange(Sender: TObject); procedure ToolButton1Click(Sender: TObject); private { Private declarations } procedure UpdateView; public { Public declarations } end; var CTForm: TCTForm; implementation uses FrmCC, GlobalNN, GlobalSB; {$R *.dfm} procedure TCTForm.FormShow(Sender: TObject); begin SFEdit.Text := ExtractFileName(FN); NOSEdit.Text := IntToStr(NumOfSamples); SNOEdit.Text := '1'; UDSNo.Max := NumOfSamples; UpdateView; end; function Poly(Num: Real; PWR: Integer): Extended; begin Result := (Num*Poly(Num,PWR-1)) end; procedure TCTForm.UpdateView; var i,PWR, SNO : Integer;
120
vS,vO, IAS : String; begin SNO := StrToInt(SNOEdit.Text)-1; CalcSample(SNO); IDEdit.Text := IntToStr(SG.Samples[SNO].Id); TCEdit.Text := SG.Samples[SNO].TargetChar; vO := ''; for i := 0 to NumOfOutput-1 do begin PWR := Round(TempN.Output[i]); vO := vO+IntToStr(PWR); end; IAEdit.Text := BinToChar(vO); IAS := CharToBin(SG.Samples[SNO].TargetChar); vS := ''; for i := 0 to Length(IAS)-1 do vS := vS+IAS[Length(IAS)-i]; with CTMemo do begin Clear; Lines.Add('TargetData : '+vS); Lines.Add('OutputData : '+vO); IAS := ''; for i := 0 to NumOfOutput-1 do IAS := IAS+FormatFloat('0.00000',TempN.Output[i])+' Lines.Add(IAS); end; end; procedure TCTForm.SNOEditChange(Sender: TObject); begin UpdateView; end; procedure TCTForm.ToolButton1Click(Sender: TObject); begin ModalResult := mrNone; Close; end; end.
121
';
Lampiran D.6. Listing Kode Unit FrmRep.pas unit FrmRep; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, ComCtrls, ToolWin, ExtCtrls, StdCtrls; type TRepFrm = class(TForm) StatusBar1: TStatusBar; Memo1: TMemo; ControlBar1: TControlBar; ToolBar1: TToolBar; ToolButton1: TToolButton; ToolButton2: TToolButton; ToolButton3: TToolButton; procedure ToolButton2Click(Sender: TObject); procedure ToolButton3Click(Sender: TObject); procedure FormCreate(Sender: TObject); private { Private declarations } public { Public declarations } end; var RepFrm: TRepFrm; implementation uses FrmCC, GlobalSB, FrmCT, GlobalNN; {$R *.dfm} procedure TRepFrm.ToolButton2Click(Sender: TObject); begin ModalResult := mrNone; Close; end; procedure TRepFrm.ToolButton3Click(Sender: TObject); begin Memo1.SelectAll; Memo1.CopyToClipboard; end; procedure TRepFrm.FormCreate(Sender: TObject); var PWR, i,j : Integer; IAS, vS, vO, S : String; vC : Char; begin with Memo1 do begin Clear; Lines.Add('SampleFile : '+ExtractFileName(FN)); Lines.Add('Num of Samples : '+IntToStr(NumOfSamples));
122
Lines.Add('Regions : '+CCFrm.RRowEdit.Text+'*'+CCFrm.RColEdit.Text); Lines.Add('Sample Varians : '+IntToStr(NumOfVarians)); Lines.Add('TargetChar(s) : '+STarget); Lines.Add('InitVal Ranges : '+IntToStr(CCFrm.RndLo.Position)+' to '+IntToStr(CCFrm.RndHi.Position)); Lines.Add('Learn Rates : '+CCFrm.LREdit.Text); Lines.Add('Momentum : '+CCFrm.MomenEdit.Text); Lines.Add('Max ErrorLevel : '+IntToStr(NumOfSamples*NumOfOutput)); Lines.Add('Epoch : '+IntToStr(Epoch-1)); Lines.Add('Last ErrorLevel : '+CCFrm.CELEdit.Text); Lines.Add(#13#10'No. TargetChar TargetData OutData OutChar Match'); for i := 0 to NumOfSamples-1 do begin CalcSample(i); IAS := CharToBin(SG.Samples[i].TargetChar); vS := ''; for j := 0 to Length(IAS)-1 do vS := vS+IAS[Length(IAS)-j]; vO := ''; for j := 0 to NumOfOutput-1 do begin PWR := Round(TempN.Output[j]); vO := vO+IntToStr(PWR); end; if (SG.Samples[i].TargetChar=BinToChar(vO)) then S := 'Yes' else S := 'No'; vC := BinToChar(vO); vO := '['; for j := 0 to NumOfOutput-1 do vO := vO+FormatFloat(' 0.00000',TempN.Output[j])+','; vo := Copy(vO,1,Length(vO)-1)+' ]'; Lines.Add(IntToStr(i+1)+' '+SG.Samples[i].TargetChar+' '+vS+' '+vO+' '+vC+''+S); end; // Lines.Add(#13#10); Lines.Add('MatchLevel : '+FloatToStr(MatchLevel)+'%'); Lines.Add('Num Of Matched : '+IntToStr(NumOfMatch)+' of '+IntToStr(NumOfSamples)); end; end; end.
123
Lampiran E.1. Flowchart Proses Pengenalan Pola
Start
Data Gathering
Samples
Learning
ANN
Proofing
Reports
End
124
Lampiran E.2. Flowchart Data Gathering
Start
Building Samples
Divide Samples into regions
Get num of active pixels from each regions
Building Samples
End
125
Lampiran E.3. Flowchart Prosedur Eksperimen
Start
Data Gathering
Learning
T ANN
Proofing
MatchLevel=100%
Y Reports End 126
Samples
Contoh Target Sample2
a
i
u
e
o
Contoh Target Sample1
A
I
U
E
O
Contoh Target Sample2
i
a
u
e
o
Num Target In1 In2 In3 In4 In5 In6 In7 In8 In9 In10 In11 In12 In13 In14 In15 In16 In17 In18 In19 In20 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
a
17 16 12 17 18 18 14 9 7 17 10 7 7 12 14 12 8
13 18 10 14 16 14 15 16 15 14 13 13 14 10 13 12 8
13 18 16 14 27 14 15 16 25 16 13 13 27 10 14 12 14
24 33 12 27 0 32 24 35 0 33 26 26 14 30 14 32 14
11 16 7 14 12 10 8 14 13 12 11 10 10 11 8 11 8
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 8 0 24 2 0 0 11 12 0 2 10 0 0 3 8
22 32 7 28 0 18 16 28 9 12 22 18 10 22 16 19 8
11 16 7 14 12 10 8 14 10 12 11 10 10 11 8 11 8
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 7 0 15 10 0 10 10 12 6 10 10 4 0 11 8
22 32 7 28 9 10 16 18 10 12 16 10 10 18 16 11 8
11 16 11 14 12 10 8 16 10 12 11 10 10 11 9 11 8
0 0 10 0 0 0 0 0 0 0 0 0 0 0 0 0 0
1 0 11 0 12 10 1 14 10 12 11 10 10 11 3 11 8
23 32 6 28 12 10 15 14 10 12 11 10 10 11 7 11 8
8 27 0 16 20 11 17 10 16 18 20 15 20 14 10 14 12
13 18 0 14 17 17 15 16 15 14 13 13 14 10 13 12 12
12 18 0 19 8 2 14 13 9 11 16 10 7 9 12 8 0
0 12 0 6 8 1 5 12 5 5 10 0 9 2 0 6 7
Num Target In1 In2 In3 In4 In5 In6 In7 In8 In9 In10 In11 In12 In13 In14 In15 In16 In17 In18 In19 In20 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45
a
i
u
26 18 16 6 6 12 12 0 10 3 2 2 6 0 3 2 0 2 3 0 2 8 0
18 13 18 6 0 0 0 3 0 12 7 0 0 0 0 2 1 0 0 3 0 0 2
33 27 18 0 0 0 0 0 0 0 1 0 0 8 0 0 5 0 0 0 0 0 0
10 20 38 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
16 14 15 9 18 16 24 6 9 0 2 19 18 6 18 0 2 5 5 3 11 19 4
0 0 0 11 0 6 0 13 9 9 19 0 0 10 0 25 19 20 6 12 0 0 11
16 14 0 0 0 0 0 0 0 9 0 0 0 0 0 0 0 0 0 0 0 0 0
16 14 30 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
16 14 15 0 16 0 23 0 0 0 0 17 18 0 2 0 0 0 0 0 14 18 0
0 0 0 14 0 19 0 20 18 0 19 0 0 18 13 21 19 14 12 17 0 0 13
16 14 0 0 0 0 0 0 0 18 0 0 0 0 0 0 0 5 0 0 0 0 0
16 14 30 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
16 15 15 0 16 0 23 0 0 0 0 17 18 0 0 0 0 0 8 0 14 18 0
0 13 0 14 0 19 0 20 18 0 19 0 0 8 15 11 19 0 4 17 0 0 13
16 9 17 1 0 0 0 0 0 18 0 0 0 10 0 10 0 19 0 0 0 0 0
16 14 13 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
14 0 24 0 11 0 16 0 0 0 0 11 16 0 0 0 0 0 5 0 4 4 0
18 0 18 15 4 17 5 7 12 0 9 5 4 0 14 0 15 0 1 7 7 17 3
8 0 5 15 3 5 5 11 2 19 9 5 2 12 3 16 2 18 0 4 0 9 8
11 8 0 0 0 2 8 2 0 0 5 0 0 5 0 1 3 0 0 0 0 0 3
Num Target In1 In2 In3 In4 In5 In6 In7 In8 In9 In10 In11 In12 In13 In14 In15 In16 In17 In18 In19 In20 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73
u
e
Num Target In1 In2 In3 In4 In5 In6 In7 In8 In9 In10 In11 In12 In13 In14 In15 In16 In17 In18 In19 In20 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100
e
o
Contoh Target Sample1
A
Num 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23
Target
A
I
Nr1
Nr2
Nr3
Nr4
N5
Nr6
0.5806
0.4194
0.6129
0
0.6129
0
0.4848
0.5455
0
0
0
0.1852
0.8519
0
0
0
0.8333
0.4444
0
0
0.5
0.7727
0
0.4286
0 0 0
E
U
I
Nr7
Nr8
0
0.4839
0.129
0.5455
0.5455
0
0.5556
0.5556
0
0.6111
0
0
1
0
1
0.4138
0.3333
0.7222
1
0
Nr9
O
Nr10
Nr11
Nr12
Nr13
Nr14
Nr15
Nr16
Nr17
Nr18
Nr29
Nr20
1
0.4194
0.4194
0.7419
0
1
0.9394
0.0303
0.6129
0
0
0.6129
0.3871
0
0
0.4839
0.3636
0.1818
0
0.5455
0.7879
0
0
0
0
0.7037
1
0.2424
0
0.2222
0.4074
0.0741
0.4815
0.4815
0
0
0.6111
0
0.3333
1
0.5926
0.6667
0.6111
0.6111
0
0
0.6111
0.2222
0
0
0.6364
0.3182
0.3182
0.1818
0.3333
1
0.5909
0.8636
0.6364
0
0
0.6818
0.3636
0
0
0.0714
0.5714
0.6429
0
0.5
0.9286
0.7857
1
0.4286
0.6429
0
0
0.6429
0.3571
0
0
0.2143
0
0
0.6897
0.6897
0
0
0.5556
0.5556
0
0.7586
0.5172
0.8276
0.2759
0.6897
0
0
0.6897
0.1724
0
0
0.4483
0
0.3889
1
0.9444
0.5
0.6667
0
0
0.6111
0.2222
0
0
0.2
0
0.3
0.3
0.3333
0.6
0
0.9
0.3667
0.6667
0.2667
0.6
0
0
0.6
0.3333
0
0
0.9565
0.1304
0
0
0.4667
0.5652
0.5652
0
0.8261
0.6087
1
0
0.5652
0
0.1304
0.4348
0.5652
0
0
0
0.1429
1
0
0.3913
0
0.6667
0.6667
0
0.381
0.7619
0.9048
0.1905
0.6667
0
0
0.7143
0.381
0
0
0
0.5455
0.3636
0.5238
0
0
1
0.9091
0
0.4545
0
0.1364
0.4091
0.4545
0
0
0.3182
0.1364
0
0
0
1
0.5
0
0
0.1667
0.625
0.7083
0
0.875
0.5833
0.625
0.5417
0.625
0
0
0.7083
0
0
0
0.5417
0
0.0769
1
0
0
0.5385
0.1923
0.3462
0
0.7692
0.4615
0.9231
0.3846
0.1538
0
0.5385
0.4231
0
0
0.1154
0.6111
0.6111
0.8889
0.1111
0.6111
0
0
0.6111
1
0.6667
0.6667
0.6667
0.5556
0
0
0.6667
0.1667
0
0
0.2222
0
0
1
0
0
0.24
0.8
0
0
0.76
0.88
0
0.04
0.6
0.36
0.16
0.64
0
0
0.48
0
1
0.1667
0
0
0.5556
0.5556
0
0.6111
0.5
0.9444
0.3333
0.5556
0
0
0.5556
0.4444
0
0
0.3889
0
0.3333
1
0
0
0.6667
0
0.6667
0.4167
0.7917
0.5
0.8333
0.6667
0
0
0.6667
0.2083
0
0
0.5833
0
0.9032
0.4516
0
0
0.6774
0.6774
0
0
0.9032
1
0
0.5484
0.1613
0.3548
0.3226
0.6452
0
0
0.6452
0.2778
0.5556
0.6111
0
0.8333
0.5
1
0
0.6111
0
0.5556
0
0.5556
0
0.1111
0.4444
0.5556
0
0
0.6667
0.9444
0.3889
0.0556
0
0
1
0
0
0
1
0
0
0
1
0
0
0.2778
0.7222
0.3889
0.0556
1
0
0
0
0.7857
0.2143
0
0
0
0.9286
0.0714
0
0
0
1
0
0
0
0.7857
0
0
0
0.75
0.25
0
0.1875
0.8125
0
0
1
0
0
0.375
0.625
0
0
0.875
0
0
0
Num 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62
Target
I
U
E
Nr1
Nr6
Nr7
Nr10
Nr11
Nr12
Nr13
Nr14
Nr15
Nr16
Nr17
Nr18
Nr29
Nr20
1
Nr2 0
Nr3 0
Nr4 0
N5 0
0.9474
0.0526
Nr8 0
Nr9 0
0
1
0
0
0
0.2105
0.7895
0
0
0
0.8421
0
0
0.4737
0.4737
0
0
0.9474
0
0
0
0.9474
0
0
0.7368
0.2105
0
1
0
0
0
1
0
0
0
0.4118
0.5882
0
0
0
0.8235
0.1765
0
0
0
1
0
0
0
0.7647
0
0.3333
1
0
0
0
0.8667
0
0
0
0.8667
0
0
0
0.8667
0
0
0.2
0.9333
0.2
0
1
0
0
0
1
0
0
0
1
0
0
0
1
0
0
0
0.5789
0
0
0
0
0
1
0
0
0.2
0.75
0
0
0.95
0
0
0.85
0.1
0
0
0.75
0
0
0
0.55
0.45
0
0
0
0.25
0.75
0
0
0
0.35
0.65
0
0
0
1
0
0
0
1
1
0
0
0
1
0
0
0
1
0
0
0
0.6842
0.3158
0
0
0
0.7368
0
0
0
0
0
0.9
0
0
0.9
0.3
0
0.5
0.7
0
1
0.2
0
0
0.9
0
0
0
0.5882
0.4118
0
0
0
0.7647
0.2353
0
0
0
1
0
0
0
1
0
0
0
0.5882
0
0
0
0
0.4706
0
0
0.4706
0.5294
0
0.6471
0.3529
0
0
1
0
0
0
0.8824
0
0
0.5625
0.4375
0
0
0
0.25
0.75
0
0
0
0.75
0.25
0
0
0
1
0
0
0
0.75
1
0
0
0
1
0
0
0
0.375
0.625
0
0
0
1
0
0
0
0.75
0
0
0
0.2
0.45
0.35
0
1
0
0
0
1
0
0
0
1
0
0
0.8
0.15
0
0
0
0
1
0
0
0
1
0
0
0.8824
0.1176
0
0.0588
0.9412
0
0
0.7059
0
0
0
0.619
0.381
0
0
0
0.1905
0.8095
0
0
0
0.0476
0.9524
0
0
0
1
0
0
0
0.7619
1
0
0
0
0.5294
0.4706
0
0
0
1
0
0
0
0
1
0
0
0
0.6471
0
0.5
0
0
0.9167
1
0
0
1
1
0
0
1
1
0
0
1
0.9167
1
1
0.6667
1
0
0
0.6471
1
0
0
1
1
0
0
1
1
0
0
1
0
0.7647
0.7647
0
1
0
0
0
1
0
0
0
1
0
0
0
1
0
0
0.9375
0.5625
0.6875
0.6875
0.5
0.6111
0
0
0.7222
0.8333
0
0
0.8333
0.8333
0
0
0.8333
0.8333
0
0.1111
0.7222
0
1
1
0
0.75
0
0
0.75
0.75
0
0
0.75
0.75
0
0
0.75
0.75
0
0
0.75
0.8125
0.75
0.75
1
0.7895
0
0
0.7895
0.7895
0
0
0.7895
0.7895
0
0
0.8421
0.7895
0
0
0.7895
0.8421
0.4737
1
0.3684
0.6842
0
0
0.9474
1
0
0
1
1
0
0
1
1
0
0
1
0.7895
0.8947
0.9474
0.5789
0.8889
0
0
0.9444
1
0
0
1
1
0
0
1
0.3333
0.6667
0
1
0
0.4444
1
0.3333
0.5
0
0
0.8182
0.8636
0
0
0.8636
0.8636
0
0
0.8636
0.8636
0
0
0.9091
0.3182
1
0.9545
0.4091
0.913
0
0
1
1
0
0
1
1
0
0
1
1
0
0
1
0.087
0.913
0.9565
0.0435
0.6
0
0
1
1
0
0
1
1
0
0
1
1
0
0.0667
0.9333
1
0.7333
0.7333
0
0.7778
0
0
0.9444
1
0
0
1
1
0
0
1
1
0
0
1
0.1667
0.8333
0.6667
0.7222
1
0
0
0.4
0.9333
0
0
0.9333
0.9333
0
0
0.9333
0.9333
0
0
0.9333
0.2667
1
1
0
0.6154
0
0
0.7692
0.7692
0
0
0.7692
0.7692
0
0
0.7692
0.7692
0
0
0.7692
0.3462
1
0.4231
0.4231
0.725
0
0
0.825
0.725
0
0
0.725
0.725
0
0
0.725
0.775
0
0
0.725
0.05
1
1
0.85
0.8889
0
0
0.7778
0.8889
0
0
0.8889
0.8889
0
0
0.8889
0.8889
0
0
1
0.7778
0.8889
0.9444
0.0556
0.75
0
0
0.625
0.75
0
0
0.75
0.75
0
0
0.75
0.75
0
0.2917
0.4583
0.5833
1
0.9167
0
0.5
0
0
0.5667
0.5
0
0
1
0.5
0
0
1
0.5
0
0.2333
0.6333
0.1
0.5667
0.5
0
0.5
0
0
0.4333
0.5
0
0
0.7667
0.5
0
0
1
0.5
0
0.0667
0.9667
0.3667
0.5333
0.5
0.0333
0.36
0
0
0.92
1
0
0
1
1
0
0
1
1
0
0
1
0.84
0.84
0.88
0.8
0.9375
0.4688
0.4063
0
0.5625
0
0
0
1
0.4688
0.1875
0
0.5625
0
0
0
0.8438
0.4688
0.4688
0.3438
1
0.4
0.3
0
0.6333
0
0
0
0.9667
0.4
0.1333
0
0.6333
0
0
0
0.6667
0.4
0.4
0.4
Num 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100
Target
E
O
Nr1
Nr2
Nr3
Nr4
N5
Nr10
Nr11
Nr12
Nr13
Nr14
Nr15
Nr16
Nr17
Nr18
Nr29
Nr20
0.9487
0.4359
0.4359
0.3846
0.5897
Nr6 0
Nr7 0
Nr8 0
Nr9 1
0.4103
0
0
0.5897
0
0
0
0.8205
0.4359
0.4359
0.3077
0.7429
0.5429
0.5429
0.3143
0.5429
0
0
0
1
0.5429
0.2571
0
0.5429
0
0
0
0.7429
0.5429
0.5429
0.3714
1
0.5789
0.6053
0
0.6316
0
0
0
0.8158
0.5789
0.3684
0
0.6316
0
0
0
0.8947
0.5789
0.5789
0.5789
0.6667
0.4583
0.4583
0.125
0.5417
0
0
0
1
0.4583
0.3542
0
0.5417
0
0
0
0.5417
0.4583
0.4583
0.4167
0.75
0.5833
0.5833
0.375
0.625
0
0
0.3333
0.7917
0.5833
0.5833
0.0417
0.625
0
0
0
1
0.5833
0.4583
0
0.9091
0.4545
0.5455
0
0.6061
0
0
0
1
0.4545
0.4545
0.3939
0.6061
0
0
0
1
0.4545
0.4545
0.3333
1
0.5938
0.5938
0.2813
0.5
0
0
0
1
0.5938
0.5938
0.25
0.5
0
0
0
0.9063
0.5938
0.5938
0.375
1
0.5429
0.5143
0
0.5714
0
0
0
0.8
0.5429
0.4571
0
0.5714
0
0
0
0.9429
0.5429
0.5429
0.3714
0.6111
0.4444
0.4444
0.1667
0.5556
0
0
0
1
0.4444
0.3611
0
0.5556
0
0
0
0.6667
0.4444
0.4444
0.3333
0.7576
0.4848
0
0
0.4848
0.0606
0.3636
0
1
0.5455
0.5455
0
0.4848
0
0
0
0.7273
0.5455
0.8182
0.4242
1
0.5294
0.5294
0.0588
0.5
0
0
0
0.9412
0.5294
0.7059
0
0.5
0
0
0
0.8824
0.5294
0.5294
0.3824
0.963
0.5185
0.5185
0.1111
0.5926
0
0
0
0.963
0.5185
0.5185
0
0.5926
0
0
0
1
0.5185
0.5185
0.3333
0.8065
0.4516
0.1935
0
0.6129
0
0
0
0.6774
0.4516
0.4516
0
0.6129
0
0
0
1
0.4516
0.4516
0.2903
1
0.24
0.28
0
0.8
0
0
0
0.92
0.24
0.16
0
0.8
0
0
0
0.76
0.24
0.24
0.04
0.9773
0.6591
0.2727
0
0.3636
0
0
0
1
0.6591
0.6591
0.1591
0.3636
0
0
0
0.7727
0.6591
0.6591
0.6591 0.1316
0
0.9474
0.5263
0.3684
0
0.5
0
0
0
1
0.2895
0
0.2105
0.2895
0
0
0.9474
0.5263
0.5263
0.7241
0.6207
0.6207
0.4138
0.6207
0
0
0
0.6207
0.4828
0.6207
0
0.6207
0
0
0
1
0.6207
0.4828
0
0.8571
0.4286
0.4286
0.2857
0.6286
0
0
0
1
0.4286
0.4286
0.1143
0.6286
0
0
0
0.7714
0.6286
0.4286
0.1143 0.381
0.619
0.9048
1
0.1905
0.9524
0
0
1
0.9524
0
0
0.9524
0.9524
0
0
0.9524
0.9048
0.7143
0.6667
0.9583
0.4167
1
0.0417
0.8333
0
0
0.8333
0.8333
0
0
0.8333
0.8333
0
0
0.8333
0.875
0.4167
0.7917
0
0.697
0.6061
0.6667
1
0.5152
0
0
0.5152
0.5152
0
0
0.5152
0.5152
0
0
0.5152
0.5455
0.6061
0.6061
0.697
0.8529
0.8529
0.7353
0.6765
0.5
0
0
0.5
0.5
0
0
0.5
0.5
0
0
0.5
0.9706
0.6176
0.6176
1
0.4348
0.5652
0.5652
1
0.9565
0
0
0.9565
0.9565
0
0
0.9565
0.9565
0
0
0.9565
0.8696
0.6087
0.6087
0.6957
0.087
0.587
0.7826
1
0.587
0
0
0.587
0.587
0
0
0.587
0.587
0
0
0.587
0.7826
0.587
0.587
0.5
0.6
0.7333
0.7333
0.2
1
0
0
1
1
0
0
1
1
0
0.5333
0.4667
0.2667
0.4
0.7333
0
0.5172
0.931
0.931
1
0.6552
0
0
0.5172
0.5172
0
0
0.5172
0.5172
0
0
0.5172
0.6897
0.931
0.931
0.3448
1
0.64
0.64
0.08
0.48
0
0
0.48
0.48
0
0
0.48
0.48
0
0
0.48
0.8
0.64
0.64
0.4
0.8
0.9667
1
0.6667
0.6333
0
0
0.6333
0.6333
0
0
0.6333
0.6333
0
0
0.6333
0.8667
0.9667
0.9667
0.8333
0.8158
0.6579
0.8421
1
0.5789
0
0
0.5789
0.5789
0
0
0.5789
0.5789
0
0
0.5789
0.9737
0.6053
0.6053
0.8684
0.8462
0.6538
0.7308
0.8462
0.7308
0
0
0.7308
0.7308
0
0
0.7308
0.7308
0
0
0.9615
1
0.6538
0.8462
0.0385
0.3214
0.4643
1
0.2857
0.7143
0
0
0.7143
0.7143
0
0
0.7143
0.7143
0
0
0.7143
0.5714
0.4643
0.5
0.0714
0.6429
0.8929
0.8571
0.8929
0.8214
0
0
0.8214
0.8214
0
0
0.8214
0.8214
0
0
0.8214
1
0.8571
0.8571
0.75
0.6897
0.5862
0.5862
1
0.6897
0
0
0.6897
0.6897
0
0
0.6897
0.6897
0
0
0.6897
0.7931
0.5862
0.5862
0.7931
0
1
0.5161
0.5806
0.5806
0.0968
0
0.6774
0.6774
0
0
0.6774
0.6774
0
0
0.6774
0.8387
0.5161
0.5161
0.4839
0.5455
0.5
0.5909
1
0.9545
0
0
0.9545
0.9545
0
0
0.9545
0.9545
0
0
0.9545
0.9091
0.5455
0.5455
0.4545
0.3636
0.6364
1
0.9697
0.6061
0
0
0.6061
0.6061
0
0
0.6061
0.6061
0
0
0.6061
0.7273
0.6364
0.6364
0.5152
0
0.9032
0.6452
0.8387
0.871
0
0
0.7742
0.7742
0
0
0.7742
0.7742
0
0
0.7742
1
0.6452
0.6452
0.6452
0.7667
0.7333
0.6333
0.3333
0.6667
0
0
0.6667
0.6667
0
0
0.6667
0.7333
0.1
0
0.6667
0
0.5333
0.6333
1
Contoh Target Sample1
A
E
U
I
O
Num Target In1 In2 In3 In4 In5 In6 In7 In8 In9 In10 In11 In12 In13 In14 In15 In16 In17 In18 In19 In20 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
A
18 0 0 0 0 0 0 0 0 0 0 0 0 0 11 0 0
13 16 5 15 11 6 29 6 30 22 3 12 24 2 11 0 18
19 18 23 8 17 14 12 13 6 3 21 8 12 26 16 25 3
0 0 0 0 0 0 0 0 0 0 0 0 0 0 2 0 0
19 0 0 0 0 1 0 0 9 0 0 0 4 0 11 0 0
0 18 15 11 14 8 20 10 9 13 14 22 15 14 0 6 10
15 18 15 11 7 9 20 10 18 13 14 20 17 5 0 20 10
4 0 0 0 7 0 0 0 0 0 0 0 0 9 11 0 0
31 0 0 6 4 13 22 7 27 19 8 10 21 0 18 0 11
13 33 19 18 22 11 15 18 11 14 16 0 14 20 12 19 9
13 31 27 12 13 14 24 17 20 23 19 3 15 12 12 22 17
23 1 0 11 19 6 8 9 8 0 4 9 13 24 12 0 6
19 12 6 11 14 9 20 12 18 13 14 10 15 10 10 1 10
0 6 11 0 0 0 0 0 0 0 0 0 0 4 0 15 0
0 0 2 0 0 0 0 0 0 3 0 0 0 0 0 9 0
19 18 13 11 15 9 20 11 18 10 15 7 17 14 12 4 10
12 26 13 4 8 5 5 4 10 13 8 3 0 11 3 16 8
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
15 8 16 6 11 3 13 6 14 9 11 0 13 3 4 12 7
Num Target In1 In2 In3 In4 In5 In6 In7 In8 In9 In10 In11 In12 In13 In14 In15 In16 In17 In18 In19 In20 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45
A
I
U
0 0 5 17 14 0 19 0 17 5 19 0 11 19 0 10 0 9 24 0 0 13 17 6 17 16 11 12
8 28 10 7 0 0 0 0 0 15 0 0 9 0 0 7 0 7 0 4 0 8 0 0 0 0 0 0
24 14 11 1 0 12 0 9 0 0 0 20 0 0 0 0 0 0 0 9 17 0 0 0 0 0 0 0
0 0 0 0 0 4 0 9 0 0 0 0 0 0 9 0 8 0 0 7 0 0 0 11 11 0 13 12
0 0 15 0 11 0 0 0 7 0 19 0 0 19 0 0 0 0 24 0 0 0 9 12 17 16 15 12
16 21 9 18 3 3 18 0 10 13 0 4 5 0 0 13 0 4 0 20 0 4 8 0 0 0 0 0
0 21 18 0 0 13 1 18 0 0 0 15 15 0 9 4 8 12 0 0 17 17 0 0 0 0 0 0
16 0 0 0 0 0 0 0 0 0 0 0 0 0 3 0 9 0 0 0 0 0 0 12 17 0 15 12
10 0 11 0 0 0 0 0 0 0 19 0 0 19 0 0 0 0 9 0 0 0 0 12 17 16 15 12
19 28 0 18 13 16 0 0 14 13 0 19 0 0 5 0 11 0 15 20 15 0 17 0 0 0 0 0
12 31 10 0 1 0 19 18 3 0 0 0 7 0 7 17 6 12 0 0 2 1 0 0 0 0 0 0
20 0 0 0 0 0 0 0 0 0 0 0 13 0 0 0 0 4 0 0 0 20 0 12 17 0 15 12
16 17 10 0 0 6 0 0 0 0 19 17 0 13 10 0 0 0 0 0 1 0 0 12 17 16 15 12
0 5 0 18 0 10 0 14 0 13 0 2 0 6 2 0 17 0 24 20 16 0 0 0 0 0 0 0
0 11 2 0 14 0 4 4 17 0 0 0 0 0 0 17 0 0 0 0 0 0 17 0 0 0 2 0
16 10 8 0 0 0 15 0 0 0 0 0 20 0 0 0 0 16 0 0 0 21 0 12 17 15 13 12
5 20 10 5 0 14 0 19 0 3 11 15 0 0 9 0 0 0 0 16 12 0 0 11 0 9 0 13
0 0 0 13 0 0 0 0 0 14 0 0 0 14 0 0 15 0 18 3 0 0 0 12 13 11 18 12
0 0 0 7 11 0 0 0 13 3 0 0 0 0 0 10 0 0 0 0 0 0 11 12 13 11 18 12
14 20 12 1 0 0 16 0 0 0 0 0 20 0 0 0 0 12 0 0 0 16 0 8 0 8 0 16
Num Target In1 In2 In3 In4 In5 In6 In7 In8 In9 In10 In11 In12 In13 In14 In15 In16 In17 In18 In19 In20 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73
U
E
15 13 16 11 21 9 14 15 16 29 16 18 15 15 9 30 30 37 26 38 32 18 30 32 35 22 25 34
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 15 12 17 19 22 22 14 15 19 19 16 16 18
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 13 9 17 19 23 22 14 18 19 18 16 0 18
15 18 17 18 23 15 17 6 20 33 14 15 17 13 23 0 0 15 11 0 6 9 0 9 0 6 0 2
15 19 18 19 23 15 18 14 20 29 16 18 15 15 25 18 19 23 19 24 26 15 20 16 20 20 16 17
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 2 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 12 0
15 19 18 19 23 15 18 14 20 29 16 18 30 23 25 0 0 0 0 0 0 8 0 0 0 0 0 0
15 19 18 19 23 15 18 14 20 29 16 18 15 15 25 32 29 39 35 31 48 19 33 32 28 36 33 32
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 15 12 16 19 22 22 14 15 19 19 16 18 18
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 6 4 0 9 14 17 14 15 19 16 13 18 24
16 19 18 19 23 15 18 14 20 29 16 18 30 30 25 0 0 0 0 0 0 1 13 8 0 0 0 0
15 19 6 19 23 15 18 14 20 31 16 18 15 15 25 18 19 23 19 24 26 15 20 16 20 20 16 17
0 0 12 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 1 0 0 0 0 0 7 7 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0
15 19 18 20 23 14 18 14 20 29 18 11 19 29 25 0 0 0 0 0 0 0 0 0 0 0 0 0
16 15 0 7 2 15 3 4 9 2 14 14 3 11 21 27 20 32 26 34 26 24 33 29 33 24 24 30
9 17 8 22 21 11 15 15 26 40 16 24 17 16 21 15 12 17 19 22 22 14 15 19 19 16 18 18
19 18 18 21 22 11 12 15 11 40 17 22 15 15 22 15 12 17 19 22 22 11 15 19 19 16 27 18
7 11 6 9 1 0 13 0 11 34 1 0 0 1 20 11 12 12 13 22 20 0 11 12 13 12 14 13
Num Target In1 In2 In3 In4 In5 In6 In7 In8 In9 In10 In11 In12 In13 In14 In15 In16 In17 In18 In19 In20 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100
E
O
26 25 25 43 0 21 30 13 23 23 29 10 4 9 15 25 24 31 22 9 18 20 0 12 12 0 23
14 14 6 29 36 18 15 19 10 20 29 13 27 11 27 16 29 25 17 13 25 17 31 11 21 28 22
14 6 7 12 20 18 15 21 24 22 25 13 36 11 27 16 30 32 19 28 24 17 16 13 33 20 19
3 0 0 0 14 12 10 4 1 33 23 23 46 3 29 2 20 38 22 8 25 29 18 22 32 26 10
16 19 20 16 0 18 22 20 20 17 17 22 27 15 19 12 19 22 19 20 23 20 18 21 20 27 20
0 0 0 0 19 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 3 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 21 20 17 17 22 27 15 15 12 19 22 19 20 23 20 21 21 20 24 20
26 21 23 44 0 18 35 20 20 17 17 22 27 15 15 12 19 22 19 20 23 20 21 21 20 24 20
14 14 6 29 38 14 15 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
14 14 4 29 11 18 15 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 7 0 0 4 20 20 17 17 22 27 15 15 12 19 22 19 20 23 20 21 21 20 24 20
16 19 20 16 8 18 22 20 20 17 17 22 27 15 15 12 19 22 19 20 23 20 21 21 20 24 22
0 0 0 0 11 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 3
0 0 0 0 0 0 0 0 0 0 0 0 0 8 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 20 20 17 17 22 27 7 15 12 19 22 25 20 23 20 21 21 20 24 20
27 31 19 34 36 29 27 19 21 18 33 20 36 4 20 20 26 37 26 16 28 23 26 20 24 31 0
14 14 6 29 20 18 22 15 10 20 21 14 27 6 27 16 29 23 17 13 24 17 16 12 21 20 16
14 14 6 29 20 14 15 14 19 20 21 14 27 11 27 16 29 23 22 14 24 17 16 12 21 20 19
9 9 1 29 5 0 4 8 0 23 34 16 23 0 10 10 25 33 1 2 21 23 15 10 17 20 30