Menghitung Mean Absolute Percent Error (MAPE) dengan MATLAB

Bagi yang berkecimpung dengan dunia peramalan (forecast) pasti akan menjumpai besaran Mean Absolute Percent Error (MAPE). Besaran ini bermaksud mengukur keakuratan hasil peramalan. Sesuai dengan namanya, MAPE memiliki satuan persentase (pecahan). Kata “mean” sendiri digunakan ketika ada banyak data yang akan dibandingkan dengan data realnya. Rumusnya adalah sebagai berikut:

Dari rumus di atas, jika Actual sama dengan Forecast maka MAPE berharga nol, yang artinya sangat akurat. Perhatikan contoh berikut ini.

Ada empat bulan ramalan, dengan tiap bulan memiliki error. Totalnya dengan rumus MAPE di atas diperoleh 17,6%. Untuk memudahkan perhitungan terkadang diperlukan aplikasi, misalnya Matlab. Error sendiri dihitung dengan fungsi berikut.

  • errors = gsubtract(Actual,Forecast)
  • errors = gsubtract(112.3,124.7)
  • errors =
  • -12.4000

Sayangnya untuk MATLAB 2008b fungsi gsubtract tidak ada (gunakan versi terkini, 2013 ke atas). Jadi diperoleh percent error, misal untuk bulan pertama, sebesar:

  • absolutePercentError=abs(errors)/112.3
  • absolutePercentError =
  • 0.1104

Seperti terlihat pada tabel di atas (11.0%). Untuk menghitung MAPE dapat menggunakan fungsi mean untuk mencari rata-rata.

  • errors = gsubtract(actual,forecast)
  • errors =
  • -12.4000 4.7000 32.3000 38.9000
  • mape = mean(abs(errors./actual))
  • mape =
  • 0.1755

Untuk menggunakan metode NARXNET dalam meramal data yang akan datang silahkan buka postingan yang lalu. Sekian, semoga bermanfaat dan karena hari ini hari raya idul fitri, saya mengucapkan “MINAL AIDIN WALFAIDZIN, mohon maaf lahir batin”.

Referensi:

Link: https://www.forecastpro.com/Trends/forecasting101August2011.html

Iklan

Penggunaan Bilangan Random Matlab dalam Aplikasi Permainan “Ular Tangga”

Bilangan random menggunakan fungsi rand pada Matlab. Fungsi yang membangkitkan sembarang bilangan dengan jangkauan nol hingga satu (pecahan) banyak diterapkan, salah satunya dalam optimisasi menggunakan algoritma genetika (GA).

Menghasilkan Output yang Tidak bisa Diprediksi

Kehidupan sehari-hari memang tidak bisa diprediksi, sehingga aplikasi permainan pun selayaknya mampu mensimulasikan kehidupan sehari-hari. Misalnya dalam game sepakbola, walaupun akurasi C. Ronaldo tinggi, tetapi karena adanya faktor ketidakpastian, maka belum tentu ketika pinalti selalu menghasilkan gol. Justru kalau gol terus, game tersebut tidak menyerupai aslinya. Sebagai contoh dalam postingan ini adalah permainan ular tangga sederhana.

Misal dua dadu dilempar beberapa kali dan harapannya tepat di titik finish (bernilai 10). Jika terlewat maka dihitung kekiri lebihannya. Mudah saja, kode berikut menggambarkan algoritmanya.

  • clc
  • sisa = 10;
  • step=0
  • history=[0 0 0 ];
  • while sisa ~= 0
    • random=2+floor(rand*10)
    • if sisa >= random
    • sisanew=sisa-random;
    • else
      • sisanew=abs(sisa-random);
    • end
    • sisa=sisanew
    • pause
    • clc
    • step=step+1
    • posisi=10-sisa
    • history=[history;[step random posisi]]
  • end
  • msgbox(‘FINISH’)

Fungsi di atas berisi pembangkitan bilangan random, melangkah dan mendeteksi apakah sudah mencapai FINISH. Offset “2” pada variabel random karena dua dadu minimal berharga “2”. Perulangan diterapkan dengan menggunakan instruksi while apakah sudah tepat di posisi 10. Berikut hasil runningnya:

Kolom tengah adalah bilangan random dan kolom ketiga menunjukan posisi terkini. Di akhir baris, yaitu lemparan ke-6, posisi tepat di angka 10 yang artinya FINISH.

Membuat Ular dan Tangga

Berikutnya ada dua lokasi ular, yaitu angka “4” yang akan memaksa balik ke nol, serta tangga pada angka “6” yang memaksa loncat ke “8”. Berikut tambahan kodenya:

  • clc
  • sisa = 10;
  • step=0
  • history=[0 0 0 ];
  • while sisa ~= 0
    • random=2+floor(rand*10)
    • if sisa >= random
    • sisanew=sisa-random;
    • else
      • sisanew=abs(sisa-random);
    • end
    • sisa=sisanew
    • pause
    • clc
    • step=step+1
    • posisi=10-sisa
    • if posisi==4
      • posisi=0;
      • sisa=10;
    • end
    • if posisi==6
      • posisi=8;
      • sisa=2;
    • end
    • history=[history;[step random posisi]]
  • end
  • msgbox(‘FINISH’)

Ada dua buah if-then untuk mengecek apakah tepat berada di titik ular atau tangga. Jika tepat maka diarahkan ke berturut-turut nol dan delapan. Hasil running di bawah tampak tidak ada angka 4 dan 6 karena akan diarahkan ke nol dan delapan. Sekian, semoga bermanfaat.

Konversi Kode String ke ASCII di Matlab

Iseng-iseng buka tulisan yang lalu tentang enkripsi karena materi mulai masuk ke pemrosesan teks, ternyata banyak yang lupa. Salah satunya adalah konversi dari string ke kode ASCII. Kode ini sangat diperlukan ketikan mengkonversi dari satu ASCII ke yang lainnya dalam rangka enkripsi.

Menambah dengan Nol

Dulu pernah belajar kode ASCII pada mata kuliah bahasa rakitan ketika membahas masalah interupt. Ternyata hingga saat ini tidak berubah.

Bagaimana mengetahui kode ASCII selain dengan tabel di atas jika menggunakan Matlab? Caranya mudah yaitu tambahkan saja string dengan nol, beres sudah. Misal huruf ‘A’ maka:

  • >> teks=’A’
  • teks =
  • A
  • >> ascii=teks+0
  • ascii =
  • 65

Di sini 65 merupakan kode HTML, yang berbeda dengan HEXA (41). Jika sudah, kita dengan mudah mengenkripsi suatu kata, misalnya “Rahmadya” dengan algoritma “tambahkan kode ASCII tiap huruf dengan satu”.

Mengenkripsi Kata

Fungsi yang diperlukan adalah CHAR untuk menampilkan kode ASCII ke string. Masukan ke command window instruksi berikut ini.

  • >> teks=’Rahmadya’
  • teks =
  • Rahmadya
  • >> enkripsi=teks+1
  • enkripsi =
  • 83 98 105 110 98 101 122 98
  • >> char(enkripsi)
  • ans =
  • Sbinbezb

Perhatikan Sbinbezb itu adalah kode enkripsi yang dihasilkan. Untuk mendekripsi caranya mudah, yaitu dengan mengurangkan satu kode tersebut.

  • >> dekripsi=ans-1
  • dekripsi =
  • 82 97 104 109 97 100 121 97
  • >> char(dekripsi)
  • ans =
  • Rahmadya

Perhatikan kode aneh “Sbinbezb” setelah dienkripsi adalah “Rahmadya”. Semoga hal sepele ini bermanfaat.

Menormalkan Data Untuk Range Sempit

Beberapa literatur, seperti (Hagan, M. T., Demuth, H. B., & Beale 1997) merekomendasikan penggunakan normal Euclidis (Euclidean) untuk menormalkan data agar hanya berada pada rang [0,1]. Alasannya adalah keortogonalan matriks konversi yang mempermudah Jaringan Syaraf Tiruan (JST) dalam proses pelatihan (Training). Postingan kali ini memperkenalkan teknik yang sering digunakan pada proses peramalan (Forecasting) dengan rentang data tertentu yang sempit, misalnya range [0.2,0.9]. Caranya adalah dengan menggunakan rumusan di bawah ini (Siang 2009):

dengan b dan a adalah data maksimum dan minimum. x’ adalah hasil konversi dari harga awal x. Perhatikan ketika x adalah data maksimum maka x’ akan berharga 0.7+0.2 sementara jika sebaliknya, x data minimum, maka 0 + 0.2 yang cocok dengan range dari 0.2 hingga 0.9. Tetapi ketika ingin dipresentasikan kembali hasil peramalan ke nilai real-nya perlu konversi kembali dengan formula:

Entah mengapa saya cenderung menggunakan normal Euclidis (fungsi normalize atau dengan memanfaatkan norm jika tidak ada fungsi normalize). Untuk versi 2013 sepertinya sudah ada fungsi normalize. Berikut tampilan Matlab jika ada fungsi yang bersangkutan. Semoga bermanfaat.

  • >> help normalize
  • — help for dfilt.normalize —
  • normalize Normalize coefficients between -1 and 1.
  • G = normalize(Hd) normalizes the feed-forward coefficients between -1
  • and 1 and returns the gain G due to normalization. Subsequent calls to
  • normalize will not change the feed-forward coefficients and G will
  • always return the gain used in the first normalization.

 

  • See also dfilt.denormalize.
  • Copyright 1988-2004 The MathWorks, Inc.

Referensi

Hagan, M. T., Demuth, H. B., & Beale, M., 1997. Neural Network Design, Boston: PWS Publishing Co.

Siang, J.J., 2009. Jaringan Syaraf Tiruan dan Pemrogramannya Menggunakan Matlab, Yogyakarta: Penerbit Andi.

 

Simulasi Membutuhkan Bilangan Random

Simulasi mencoba menjalankan suatu model seolah-olah mengikuti kenyataan yang ada. Simulasi banyak diterapkan dalam permainan. Misalnya pemain bola, C. Ronaldo, dalam game memiliki akurasi tinggi dalam mencetak gol, tetapi tentu saja tidak selalu tendangannya akurat, seperti kenyataan di lapangan sesungguhnya. Jadi ketika pemain tersebut mengeksekusi, program harus membangkitkan suatu bilangan acak dalam rentang akurasinya sehingga bisa saja tendangannya (misal pinalti) tidak berhasil.

Fungsi “rand” di Matlab

Salah satu fungsi di Matlab yang membangkitkan bilangan random adalah fungsi rand. Fungsi ini membangkitkan bilangan acak dari nol hingga satu dalam pecahan. Ketik saja “rand” pada command window maka akan dimunculkan bilangan pecahan yang dimaksud.

Silahkan ketik help rand di command window maka akan muncul tata cara penggunaannya. Bahkan ada varian lagi dari fungsi tersebut di bagian akhir help (suggestion). Untuk membuat bilangan random yang dalam rentang tertentu, misal 9 hingga 10 butuh trik kusus, misalnya rand*10 atau 9+rand.

Contoh Kasus

Program berikut mensimulasian fungsi tangga dari suatu rangkaian masa dan suspensi. Disimulasikan beberapa komposisi pegas dan peredam yang menghasilkan beberapa kemungkinan. Perlu pengetahuan fungsi alih (transfer function) dan juga penggunaan fungsi plot pada Matlab. Buku command window.

  • figure
  • hold

Dua instruksi di atas akan menyiapkan satu gambar yang akan digunakan untuk menangkap output tiap-tiap komposisi pegas peredam. Fungsi hold membuat grafik menangkap lebih dari satu komposisi.

  • m=100;
  • for i=1:4
  • c=rand*10;
  • k=rand*10;
  • model=tf([1],[m c k])
  • step(model)
  • end

Kemudian Matlab mengeksekusi kode di atas dengan jumlah loop sebanyak empat kali. Tiap loop mencetak (fungsi step) model yang dalam bentuk fungsi alih tersebut. Massa diset 100 karena memang tidak terlalu berubah (massa motor, mobil, dan sebagainya cenderung tetap). Di sini nilai hanya sebagai contoh saja (tanpa satuan, dan standar yang telah ditentukan dalam perancangan elemen mesin). Selamat mencoba.

Variabel Dinamis pada Fungsi Alih Simulink Matlab

[m.kul,ruang,dosen,jur:t-pemodelan-simulasi,software,rahmadya-phd,t-kom-d3]

Berbicara mengenai fungsi alih, mau tidak mau harus sedikit kilas balik ke materi pengenalan pengaturan (tek. Kendali). Untuk mudahnya ambil kasus sederhana suspensi kendaraan (post terdahulu). Fungsi alih suatu sistem suspensi adalah:

Fungsi Alih = 1/(ms^2+cs+k)

m, c dan k berturut-turut massa (Kg), peredam (N.s/m), dan konstanta pegas (N/m). Kemudian untuk memasukan variabel dinamis fungsi alih, buka simulink dengan mengetik simulink pada command window Matlab.

Memasukan Variabel Dinamis

Untuk mensimulasikan sistem suspensi pada model simulink masukan tiga diagram blok antara lain: masukan tangga, fungsi alih, dan keluaran yang ditangkap oleh scope. Masukan tangga berada di bagian SOURCE, fungsi alih di bagian CONTINUOUS, dan scope pada bagian SINK. Caranya adalah dengan mendrag ke lembar model.

 

Atur fungsi alih (transfer function) agar diperoleh persamaan di awal tulisan ini. Gunakan variabel m, c dan k yang mewakili massa, peredaman, dan kekakuan pegas.

Tekan ganda transfer function dan isikan sebagai berikut. NOTE: Nilai m, c dan k di sini berupa variabel yang jika langsung dijalankan akan memunculkan pesan kesalahan.

Mengisi Variabel lewat Command Window

Bagaimana memasukan m, c, dan k? Mudah saja, kembali ke command window, ketikan saja tiga variabel itu dengan bilangan.

>> m=100;

>> c=20;

>> k=5;

Kembali ke jendela model. Tekan tombol RUN pada jendela model yang berupa segitiga warna hijau. Pastikan tidak muncul error. Lanjutkan dengan mengklik ganda SCOPE untuk melihat grafiknya.

Atur komposisi c dan k agar diperoleh respon yang halus (smooth). Bagaimana terapan ke program GUI-nya? Sepertinya butuh postingan tersendiri karena ada sedikit masalah saat praktek tadi, yaitu data m, c, dan k tidak terkirim ke jendela model.

 

Sanggupkah ANFIS Mengenali Pola Gambar?

[m.kul/ruang/dosen:pengenalan-pola/software/rahmadya]    

Adaptive Neuro-Fuzzy Inference System (ANFIS) merupakan gabungan Jaringan Syaraf Tiruan (JST) dengan Fuzzy Inference System (FIS). Cara kerja neuron pada JST (lihat JST sederhana) lebih sederhana dibanding dengan ANFIS (lihat post dasar2 ANFIS). Pada ANFIS jumlah neuron harus mengikuti jumlah masukan dan fungsi keanggotaan (membership function) tiap masukan. Selain itu tiap bilangan numerik (crisp) masukan harus dikonversi menjadi fuzzy sets. Akibatnya butuh proses komputasi dibanding JST yang langsung meneruskan masukan numerik ke pembobotan di neuron.

Kasus Citra Hitam-Putih

Citra hitam-putih (B/W) hanya mengenal dua angka yaitu 1 dan nol yang merepresentasikan citra (beberapa peneliti menganjurkan dengan 1 dan -1), sehingga tiap masukan hanya mengenal dua nilai itu. Secara intuitif JST lebih praktis dibanding ANFIS karena kemampuan fuzzy dari ANFIS tidak berfungsi jika hanya bernilai biner (1 dan 0). Tetapi jika kasusnya RGB atau CMYK dengan range bilangan yang cukup besar 0 hingga 255 maka peran fuzzy pada ANFIS jadi penting.

Masalah Jumlah Masukan pada ANFIS

Jika menggunakan data angka 1 sampai 5 yang direpresentasikan dengan matriks berukuran 5×3 maka kita memiliki vektor berukuran 1×15 untuk tiap-tiap angka. Jadi ada 15 input pada ANFIS-nya. Ketika dipraktekan di kelas, baik Matlab 2013 maupun 2014 dengan prosesor i5 dan RAM 4 Gb, anfisedit pada Matlab tidak sanggup.

Pesan kesalahan tersebut muncul di tahap Generate FIS yaitu setelah tombol OK ditekan. Matlab tidak sanggup meng-create ANFIS dengan masukan sebanyak 15. Berikut ini dicoba dengan mereduksi tiap angka menjadi 5 masukan.

Rule akan terbentuk sebanyak 32 buah kombinasi dari MFs (membership function) dengan satu masukan dengan masukan lainnya. Ketika di-training dengan hybrid method dihasilkan ANFIS yang siap dipakai.

Mereduksi Jumlah Masukan

Cara mereduksi masukan adalah dengan menerapkan fungsi imresize pada Matlab. Fungsi ini akan menghasilkan citra yang lebih kecil ukurannya. Tapi tentu saja akan sedikit berbeda dengan citra sebelum direduksi. Selain itu citra yang tadinya berbentuk biner berubah menjadi real. Misal kita memiliki image angka dua dengan ukuran 5×3 (atau vektor sepanjang 15 kolom).

  • >> duaReal
  • duaReal =
  • 1 1 1
  • 0 0 1
  • 1 1 1
  • 1 0 0
  • 1 1 1

Jika diterapkan fungsi imshow akan diperoleh image angka 2 (lihat yang berwarna putihnya).

  • imshow(duaReal,’InitialMagnification’,5000)

Selanjutnya kita reduksi dengan fungsi imresize. Perhatikan di bagian akhir (0.75) menyatakan persentasi pengecilan dari ukuran sebenarnya.

  • >> duaCrop=imresize(duaReal,.75)
  • duaCrop =
  • 0.6902 0.8532 1.0162
  • 0.4380 0.7667 1.0654
  • 0.8851 0.2718 0.2707
  • 0.9837 0.9288 0.9316

Gambar berikut adalah pengecilan menjadi setengahnya (kiri) dan diperbesar 3 kali lipat (kanan). Sepertinya yang diperkecil tidak begitu jelas.

Jadi bagaimana, sanggupkah ANFIS mengenali pola citra? Sepertinya perlu membatasi jumlah masukan kira-kira 5 sampai 10 untuk laptop rata-rata. Selain itu perlu preprocessing untuk mereduksi pola. Jangan lupa, perhatikan batas pengecilan maksimal agar citra masih dikenali, dan terhindar dari false positive. Sekian, selamat mencoba.