Kamis, 12 September 2019

KONSEP DASAR JST 8: SCRIPT PNN DAN CPNN DENGAN MENGGUNAKAN R


Finally, kita sampai di penghujung pembahasan terkait PNN dan CPNN. Yeaaay! Berikut merupakan script R untuk menghitung probabilitas kelas bersyarat dengan menggunakan PNN dan CPNN. Pembahasan PNN dan CPNN berikut algoritma yang digunakan dalam script ini mengacu pada penelitian yang dilakukan oleh Zeinaly dan Story (2017) dan dibuat oleh Pak Hastu tanpa mengubah petunjuk dan arahan yang bapak berikan, hanya menambahkan sedikit keterangan tambahan dan link untuk memahami format fungsi R-nya lebih lanjut. Kalimat yang saya cetak tebal (bold) merupakan tambahan keterangan dari saya. Saya akan coba jelaskan secara garis besar maksud dan alur berpikir dari script yang saya lampirkan berikut ini, ya! Sekaligus akan saya sertakan juga contoh datanya, jadi kalian langsung download juga.

Berikut ini merupakan script PNN dan CPNN beserta dengan penjelasannya

# Ini script pnn dan cpnn yang aku bikin tanpa menggunakan paket dari R
# atau dengan kata lain, dibuat dari awal, mengacu pada paper zeinali
# Buat dipelajari, ada baiknya jangan dijalankan langsung, tapi baris demi baris saja dulu
# caranya, taruh kursor di baris paling atas (nomer satu, berisi komentar ini script pnn ... dst)
# Setelah itu, tekan cntrl+enter, maka R akan mengeksekusi sebuah instruksi di baris bawahnya
# Lakukan hal ini sampai baris paling bawah, sambil dipelajari kira2 apa maksud script yg aku
# sudah aku tulis ini
#Sama seperti mengetikkan “reinit” di GrADS atau “clear all” di Matlab, remove list -> rm(list) di R memiliki peranan yang serupa, yaitu untuk menghapus semua objek atau membersihkan workspace pada menu entri sehingga program kembali ke kondisi “default”, kondisi awal, dimana belum ada fungsi yang aktif, belum ada data yang dipanggil, dan lain-lain. Sehingga tidak ada fungsi atau command yang tumpang tindih nantinya. Sementara itu, penjelasan yang lebih lengkap mengenai dev.list dan  dev.off dapat kalian baca di link ini. 

rm(list = ls())
while(!is.null(dev.list())) dev.off()

# Pastikan di R mu sudah terinstal paket dplyr. kalau baris nomer 18 ini error
# Saat dijalankan, itu berarti paket dplyr belum ada di komputermu.
# Untuk menginstal paket ini bila belum ada, caranya:
# 1. pastikan komputermu terhubung ke internet
# 2. ketik install.packages('dplyr') di bagian console (di bawah script script editor ini)
# Setelah itu jalankan kembali bari nomer 18 ini
# Di sebagian device, termasuk di punya saya ketika saya mengetikkan library(dplyr) maka muncul peringatan berikut.
Attaching package: ‘dplyr’

The following objects are masked from ‘package:stats’:

    filter, lag

The following objects are masked from ‘package:base’:

    intersect, setdiff, setequal, union
# Peringatan tersebut setelah saya baca artinya bahwa kedua packages memiliki fungsi dengan nama yang sama. Dalam kasus ini, dplyr dengan stats memiliki 2 fungsi yang sama serta dplyr dengan base memiliki 4 fungsi yang sama. Jika memang terganggu dan tidak ingin peringatan tersebut muncul kembali, kalian bisa mengetikkan library(dplyr, warn.conflicts=false).

library(dplyr)

# Fungsi di bawah ini digunakan untuk menghitung jarak Euclidian antara nilai 1 dan nilai 2. Fungsi rbind digunakan untuk menggabungkan data by row (berdasar baris) antara nilai 1 dan 2, kemudian baru dihitung jarak Euclidnya dengan fungsi dist. Penjelasan lebih lanjut untuk fungsi dist dapat kalian lihat di link berikut, sementara untuk rbind di link berikut. Ohiya, bagi yang sama kayak aku penasaran sama maksud simbol ini %>%, jadi simbol tersebut sangat identik digunakan ketika kita menggunakan library(dplyr), jadi kayak udah pasangan gitu mereka berdua. Ketika kita tidak memanggil library(dplyr) maka kita tidak mungkin bisa mengeksekusi command di bawah ini.

jarak.kuadrat <- function(nilai.1, nilai.2) nilai.1 %>% rbind(nilai.2) %>% dist %>% '^'(2)

# Setelah menghitung jarak Euclid, kemudian menghitung nilai kernel (omega.ij) dengan data input baru (x.new), data yang sudah ada (x.cij) dengan spread parameter (sigma.input). Perhitungan ini persis seperti rumus yang tertera dalam paper Zeinali dan Story (2017) dan sudah dijelaskan pada postingan sebelumnya.

omega.ij <- function(x.new, x.c.ij, sigma.input) {
  argumen <- -jarak.kuadrat(x.new, x.c.ij) %>% '/'(2 * (sigma.input^2)) %>% exp
  return(argumen / (
    ((2 * pi)^(length(x.new) / 2)) * (sigma.input^length(x.new))
  )
  )
}

# Setelah mendapatkan nilai kernel untuk tiap data, maka dilanjutkan dengan menghitung probabilitas kelas bersyarat (class-conditional probability, p.x.new.ci), dimana gamma.input tidak diperhitungkan dalam PNN dan diperhitungkan nilainya dalam CPNN. Fungsi p.x.new.ci digunakan untuk menghitung nilai class-conditional probability, sementara jumlah.omega dihitung dengan mempertimbangkan nilai dari gamma.input untuk menyeleksi seberapa banyak data.input yang dipertimbangkan dalam perhitungan. Kemudia nilai kernel yang terpilih diurutkan dengan fungsi sort dari urutan yang terbesar ke terkecil (rev). Setelah itu, sama seperti perhitungan dalam algoritma PNN, nilai tersebut dihitung rata-ratanya (mean).

p.x.new.ci <- function(x.new, data.input, sigma.input, gamma.input = NULL) {
  if(!is.null(gamma.input) & is.numeric(gamma.input)) {
    jumlah.omega <- data.input %>% nrow %>% '*'(gamma.input) %>% round
    omega <- apply(data.input, 1, function(input1)
      omega.ij(x.new, input1, sigma.input)) %>% sort %>% rev
    return(omega[1:jumlah.omega] %>% mean(na.rm = TRUE))
  } else {
    apply(data.input, 1, function(input1)
      omega.ij(x.new, input1, sigma.input)) %>% mean(na.rm = TRUE)
  }
}

# Pada algoritma CPNN, fungsi di atas selanjutnya diterapkan pada “kelas terpilih” SAJA yang ditentukan berdasarkan gamma.input dan untuk dapat melakukan penerapan fungsi pada bagian yang terpilih maka digunakan fungsi tapply(X, index, fun), dimana X adalah objek (vektor), index adalah list yang mengandung vektor, dan fun adalah fungsi yang ingin diterapkan. Selanjutnya juga terdapat sapply yang memiliki fungsi yang sama dengan lapply namun dapat digunakan untuk kembali ke perhitungan vektor. Penjelasan lebih lanjut mengenai fungsi ini dapat dilihat melalui link berikut. Kemudian sebagai output, kelas ditentukan berdasarkan nilai Parzen yang terbesar (which.max)

c.pnn <- function(x.new, data.input, data.kelas, sigma.input, gamma.input = NULL) {
  indeks.kelas <- tapply(1:length(data.kelas), data.kelas, function(input1) return(input1))
  hasil.p.x.new.ci <- sapply(
    indeks.kelas, function(input1) {
      p.x.new.ci(x.new, data.input[input1, ], sigma.input, gamma.input)
    }
  )
  output <- data.frame(
    kelas = (data.kelas %>% as.factor %>% levels)[hasil.p.x.new.ci %>% which.max],
    nilai.parzen.terpilih = hasil.p.x.new.ci[hasil.p.x.new.ci %>% which.max]
  )
  rownames(output) <- NULL
  return(output)
}

# Baris-baris script di atas adalah fungsi2 untuk melakukan proses perhitungan
# PNN dan CPNN. kedua algoritma tersebut dipanggil menggunakan fungsi yang sama,
# yaitu c.pnn(). yang membedakan adalah: untuk pnn, parameter gamma tidak usah diisi,
# atau diisi dengan 'NULL', sedangkan untuk melakukan proses perhitungan cpnn,
# Parameter gamma diisi dengan angka real 0 s/d 1.
# Implementasi pada contoh data adalah sbb:
# Buka filenya
# Pastikan mengisi dengan lengkap nama direktorinya juga, di dalam tanda petik,
# Misalnya:
# 'D:/skripsi/contohdata.csv'
# Tapi karena di komputerku sudah aku set direktorinya, jadi tdk perlu aku tambahkan
# Kalau di komputermu, tambahkan nama direktorinya
contoh.data <- read.csv('D:/contohdata.csv', sep = ';')

# Standardisasi fitur-fiturnya kecuali fitur respon
# Seperti yang kita ketahui bahwa syarat perhitungan dengan PNN dan CPNN, prediktor yang dimiliki harus distandardisasi atau dinormalisasi. Dalam R, perhitungan ini dilakukan dengan menggunakan fungsi scale, KECUALI pada kolom VINTAGES karena merupakan variabel respon dalam kasus ini

contoh.data.scale <- scale(contoh.data %>% select(-vintages))

# Ambil beberapa contoh data untuk dicoba, misalnya sejumlah 10
# Sebelum digunakan untuk menguji data diluar data training, maka perlu dicoba dulu untuk menguji beberapa sampel dari training data itu sendiri. Ketika hal ini dilakukan, kita dapat mengetahui apakah model kita underfitting atau overfitting. Command selanjutnya insyaAllah lebih mudah dimengerti dan sudah disertai dengan keterangan yang sudah cukup membantu, ya kan?

indeks.coba <- sample(1:nrow(contoh.data.scale), 10, replace = FALSE)

# Pisahkan data training dengan testing
training <- contoh.data.scale[-indeks.coba,]
testing <- contoh.data.scale[indeks.coba,]

# Buat daftar respon training dan testing sesuai uruta pengambilan acak
respon.training <- contoh.data$vintages[-indeks.coba]
respon.testing <- contoh.data$vintages[indeks.coba]

# Coba kita lihat hasilnya
head(training, 30)
View(testing)
head(respon.training, 30)
View(respon.testing)

# Sekarang kita coba menjalankan pnn dg nilai sigma = 0.7
hasil.pnn <- apply(
  testing, 1, function(input) {
    c.pnn(x.new = input,
          data.input = training,
          data.kelas = respon.training,
          sigma.input = 0.7)
  }
)

# Sekarang kita coba menjalankan cpnn dengan nilai sigma 0.7 dan nilai gamma 0.9
hasil.cpnn <- apply(
  testing, 1, function(input) {
    c.pnn(x.new = input,
          data.input = training,
          data.kelas = respon.training,
          sigma.input = 0.7,
          gamma.input = 0.9
    )
  }
)

# Sekarang lihat hasil pnn:
(hasil.pnn)

# Sekarang lihat hasil cpnn:
(hasil.cpnn)

# Sekarang kita lihat confussion:
# Fungsi table disini adalah untuk membuat tabel dengan respon.testing sebagai row dan hasil sapply sebagai kolom dengan format karakter (as.karakter). Penjelasan lebih lanjut terkait tabel dapat kit abaca melalui link berikut. 

conf.pnn <- table(respon.testing %>% as.character,
                  sapply(hasil.pnn, function(input) input$kelas) %>% as.character)

# Sekarang kita lihat confussion:
conf.cpnn <- table(respon.testing %>% as.character,
                   sapply(hasil.cpnn, function(input) input$kelas) %>% as.character)

# Tampilkan hasilnya:
(conf.pnn)
(conf.cpnn)

Jadi seperti itulah, script PNN dan CPNN. Catatan: INGAAT! untuk semua tulisan yang bold harus dihapus terlebih dahulu ya sebelum mengeksekusi script ini di R. Semoga tulisan ini bisa bermanfaat dan mohon doanya agar tugas akhirku dapat diselesaikan dengan baik, yaa! See you next time! Hehe.


KONSEP DASAR JST 7: PNN vs CPNN


Yeay! akhirnya sampailah kita sampai bahasan ini, tentang salah satu jenis jaringan saraf tiruan (JST) yaitu Probability Neural Network (PNN) dan Competitive Probability Neural Network (CPNN). Mari bahas satu persatu mulai dari PNN, ya! PNN merupakan jenis algoritma JST yang digunakan secara luas untuk pengenalan pola (pattern recognition) dan masalah klasifikasi. PNN didesain untuk menyelesaikan masalah klasifikasi menggunakan pendekatan memori statistik. Dalam algoritma PNN, Parzen window digunakan untuk prakiraan nonparametric (nonparametric approximation) nilai PDF dari setiap kelas populasi dan aturan Bayes kemudian digunakan untuk mengalokasikan kelas dengan probabilitas posterior tertinggi sebagai data input baru sehingga peluang untuk melakukan kesalahan klasifikasi (misclassification) dapat diminimalisasi (Zeinali dan Story, 2017).
Penggunaan PNN secara luas awalnya dimulai dengan penggunaan fungsi kernel (Gaussian kernel) untuk analisis diskriminan dan pengenalan pola. Sejak saat itu, penelitian terkait dilakukan untuk meningkatkan performa dari PNN. CPNN merupakan salah satu pengembangan PNN dengan dengan menambahkan fitur kompetitif baru (gamma, Î³) sehingga “hanya” data yang “paling kritis” terhadap proses klasifikasilah yang akan digunakan dalam perhitungan.

 
Sebuah himpunan data latih (training dataset) S= {Xci,j} untuk masalah klasifikasi mengandung input Xci,j (data ke-j pada kelas Ci). Jika S juga meliputi data input untuk kelas NC, maka S dapat dibagi menjadi subhimpunan NC, misal Ci, yang mengandung data masukan kelas (misal, Ci = {Xci,1, Xci,2, …., Xci,|Ci|}). Dalam teknik klasifikasi pembelajaran supervisi, vektor input baru Xnew harus diklasifikasikan dalam salah satu kelas NC yang memiliki probabilitas posterior tertinggi. Ketika tidak ada informasi sebelumnya yang diketahui tentang kelas-kelas tersebut, teori Bayes berikut digunakan untuk menentukan/mengklasifikasikan vektor input baru kedalam kelas dengan probabilitas posterior tertinggi menggunakan argmax (argument maxima), P(Xnew | Ci) adalah probabilitas bersyarat kelas Ci (class-conditional probability of Ci):


 
Parzen (1962) dan Cacoullos (1966) menunjukkan bahwa penaksiran dengan menggunakan PDF dapat dilakukan dengan merata-ratakan multivariate normal Gaussian Kernel yang merupakan produk dari masing-masing univariate kernel dengan pusat (mu, mean) pada masing-masing sampel yang diketahui (baca: Konsep Dasar JST 6 untuk lebih detail). Berdasarkan teknik ini, probabilitas kelas bersyarat dari kelas Ci adalah sama dengan:

Sementara itu, nilai gaussian kernel ωi,j dihitung menggunakan rumus berikut:
dimana:
Xnew       : nilai input baru
Ci            : cardinality dari himpunan bagian Ci
ωi,j          : Gaussian kernel dari Xci,j (multivariate normal, nonsingular)
d             : dimensi data, misal data memiliki 3 variabel prediktor maka d=3
σ           : parameter sebaran (spread parameter) yang diatur konstan dan ditentukan berdasarkan eksperimen dengan nilai antara 0 dan 1.
||Xnew – Xci,j||     : Jarak Euclidian, perhitungan nilai ini sangat penting dalam pembobotan parzen

Dalam persamaan 3, spread parameter (σ) adalah parameter yang dapat disesuaikan (adjustable parameter) ditentukan berdasarkan eksperimen (trial and error) dan untuk vektor input yang telah dinormalisasi maka parameter σ bernilai 0 hingga 1. Ingat! Terdapat 2 syarat pre-processing sebelum melakukan perhitungan dengan menggunakan Parzen window, yaitu:
1.      Data input yang digunakan sudah dinormalisasi atau distandardisasi
2.      Nilai σ diatur konstan
Arsitektur PNN sendiri terdiri dari 4 lapisan/layer, yaitu input layer, pattern layer, summation layer, dan output layer. Algoritma ini mengandung 3 langkah penting, yaitu perhitungan kernel (PDF), perhitungan probabilitas kelas bersyarat, dan memilih nilai probabilitas kelas bersyarat maksimum. Untuk lebih jelasnya, coba perhatikan gambar alur berikut ini:

Seperti yang telah diketahui, semua kelas kernel dalam PNN digunakan dalam estimasi nilai PDF setiap kelas dan parameter sebaran (σ) dapat dioptimalkan. Dalam beberapa kasus dimana input-output sangat kompleks, klaster kelas dari data dapat terletak jauh satu sama lain dan klaster data dari kelas yang berbeda dapat terletak dekat (bercampur). Jarak tersebut bisa jadi menjadi penyebab berkurangnya nilai probabilitas posterior dari kelas yang benar dan memicu misklasifikasi. Bedanya, CPNN memiliki parameter tambahan yaitu gamma (γ) yang menyebabkan hanya nilai kernel optimum saja yang diperhitungkan dalam klasifikasi. Untuk setiap nilai input data kernel baru dalam setiap kelas dihitung dan diurutkan (di-rank) dari yang terbesar ke terkecil. Pemeringkatan ini terdiri dari kompetisi antar kernel agar dapat memiliki kesempatan untuk dilibatkan dalam perhitungan nilai probabilitas kelas bersyarat.

 
Berbeda dengan PNN, CPNN memiliki 1 layer tambahan, yaitu competition layer, yang terletak antara layer perhitungan Gaussian kernel dan layer perhitungan probabilitas kelas bersyarat (langkah 1 dan 2 dalam gambar 2). Pada competition layer, terdapat 2 langkah tambahan, yaitu nilai kelas kernel diurutkan atau diperingkat dari yang terbesar ke yang terkecil. Semua nilai kernel berkompetisi untuk diikutkan dalam perhitungan probabilitas kelas bersayarat, namun hanya sebagian yang digunakan dimana nilainya ditentukan oleh parameter gamma (γ). Jumlah kernel yang terpilih dalam kelas-i ditentukan sebagai jumlah pemenang (number of winner, NWi). Rasio γ didefinisikan sebagai rasio dari NWi terhadap total nilai kernel pada setiap kelas-i :

Rasio γi bukanlah variabel yang kontinyu dan mungkin memiliki nilai terbatas (finite number of values). Berdasarkan penjelasan di atas, maka perhitungan probabilitas kelas bersyarat pada CPNN dihitung berdasarkan:

Dengan kata lain, PNN tradisional dapat dikatakan merupakan bentuk spesifik CPNN dengan nilai γ=1 untuk semua kelas kernel. Bagaimana sudah dapat tentang PNN dan CPNN? Next post I will discuss about the script, ya! Salam ^^


Minggu, 08 September 2019

KONSEP DASAR JST 6: PARZEN WINDOW


Halo temen-temen, apa kabar setelah libur panjang ini? Bagi yang masih kuliah di STMKG ya hehe. Baiklah, yuk langsung bahas sekuel bahasan jaringan saraf tiruan keenam, yaitu tentang parzen window. Metode parzen window dikenal juga sebagai metode Parzen-Rosenblatt window digunakan secara luas dalam pendekatan nonparametric untuk mengestimasi/memperkirakan nilai fungsi densitas peluang (pdf, probability density function, p(x) untuk titik spesifik x dari sampel titik xn.
Well, secara sederhana, parzen didefinisikan sebagai modifikasi persamaan peluang dengan menganggap setiap data adalah sebuah himpunan data. Definisi lain menjelaskan bahwa parzen merupakan rata-rata dari total jumlah parzen dari masing-masing rerata (mu, µ) setiap data dengan sigma (σ) diatur konstan. Sementara, pada pdf normal (Gaussian/fungsi kernel), seluruh data digambarkan sebagai satu himpunan dalam kurva distribusi normal. Masih bingung? Baik, jika sebelumnya kita tahu pdf digambarkan dalam grafik distribusi normal misal sebagai berikut:


Kita tahu distribusi normal fungsi kernel diatas dibentuk dari nilai µ 25.8 untuk satu himpunan data suhu. Sementara itu, pada konsep parzen window, setiap elemen nilai yang menyusun himpunan data suhu masing-masing dibuat fungsi kernel-nya (pdf) dengan menjadikan nilai elemen tersebut sebagai nilai rata-rata (µ) untuk membentuk “pdf-pdf yang banyak (sebanyak jumlah data)”. Selanjutnya setiap fungsi kernel yang tumpang tindih tersebut (lihat gambar 2) akan dihitung nilai rata-rata “barunya” untuk menggambarkan parzen window yang juga merupakan rata-rata densitas data. Sehingga nilai peluang (pn(x)) yang dihasilkan akan “lebih teliti” dibandingkan jika kita mencari nilai peluang berdasarkan Gaussian kernel pada kurva distribusi normal.


Secara matematis, peluang kelas bersyarat (the class-conditional probability, P(Xnew|Ci), dengan menggunakan parzen (Zeinali dan Story, 2017) dihitung dengan menggunakan:
dimana:
Xnew    : nilai input baru
Ci         : cardinality dari himpunan bagian Ci
ωi,j       : Gaussian kernel dari Xci,j (multivariate normal, nonsingular)
d          : dimensi data, misal data memiliki 3 variabel prediktor maka d=3
σ     : parameter sebaran (spread parameter) yang diatur konstan dan ditentukan berdasarkan eksperimen dengan nilai antara 0 dan 1.
||Xnew – Xci,j||  : Jarak Euclidian, perhitungan nilai ini sangat penting dalam pembobotan parzen    : 

Temen-temen sebagian mungkin familiar dengan jarak Euclid, beberapa mungkin tahu konsepnya namun tidak tahu namanya, beberapa lainnya mungkin masih asing dengan ini hehe. Baiklah, jika misal saya tanya berapa jarak orang berbobot 50 kg dan 60 kg?
Maka, kita biasanya langsung refleks menjawab 10 kg.
Pertanyaannya, darimana angka 10 tersebut muncul? Apakah dari nilai 60kg – 50 kg?
Tidak salah memang, namun kurang lengkap juga. Nilai 10 tersebut sebenarnya didapatkan dari perhitungan berikut:
r = [(x1 – x2)2]1/2
dimana, r adalah jarak euclid, x1 adalah nilai pertama dan x2 adalah nilai kedua, maka nilai 10 diatas didapatkan dari
r = [(x1 – x2)2]1/2
r = [(50 – 60)2]1/2
r = [(-10)2]1/2
r = (100)1/2
r = 10
Jadiiii, seperti itulah konsep Parzen Window secara mudahnya dijelaskan. Semoga pembaca bisa menjadi lebih mengerti, yaa! See you in my next, post! ^^


Rabu, 07 Agustus 2019

KONSEP DASAR JST 5: NORMALISASI DAN STANDARDISASI

Salah satu syarat agar suatu data sampel dapat diolah dengan Parzen-window dalam PNN dan CPNN adalah data tersebut harus dinormalisasi atau di-standardisasi. Kata “atau” disini bukan berarti normalisasi sama dengan standardisasi, tetapi data sampel yang dijadikan training dapat dinormalisasi, atau jika tidak dapat distandardisasi. Normalisasi sendiri digunakan untuk mengukur data (scale the data) atribut sehingga nilainya berada dalam rentang nilai yang lebih kecil (smaller range), seperti -1,0 sampai 1,0 atau 0,0 sampai 1,0. Normalisasi data umumnya digunakan untuk algoritma klasifikasi. Normalisasi umumnya dibutuhkan ketika kita bekerja dengan data/atribut pada skala yang berbeda sangat jauh (misal panjang jalan vs diameter amoeba), sehingga menyebabkan “dilution in effectiveness” dari atribut yang sama-sama penting (pada skala yang lebih rendah) karena atribut lain dengan nilai skala yang lebih besar. Secara sederhana, ketika atribut-atribut yang digunakan memiliki nilai dengan skala yang berbeda, dapat memicu performa model yang buruk ketika melakukan proses data mining. Sehingga atribut-atribut data tersebut perlu dinormalisasi sehingga ‘mereka’ memiliki skala atau ukuran atau dimensi yang sama.

Berikut merupakan contoh data yang perlu dinormalisasi atau distandardisasi:
HUJAN
(mm)
SUHU
(°C)
TEKANAN
(mb)
0.2
27,0
1003,1
0.1
30,1
1008,9
14
20,0
1001,0
0.8
19,8
1006,9
0.1
21,3
1005,8
0
24,8
1009,9
0
29,4
1003,9

Berdasarkan contoh di atas, dapat kita ketahui jika variabel hujan, suhu, dan tekanan memiliki “satuan” yang berbeda, masing-masing yaitu mm, celcius, dan mb. Konsep normalisasi atau standardisasi akan (atau bertujuan) menyamakan satuan variabel/atribut/data-data tersebut. Sehingga setelah dinormalisasi data dilakukan, variabel-variabel tersebut akan memiliki dimensi/ukuran/skala yang sama. Terdapat beberapa metode normalisasi data:

1.       Decimal scaling
Normalisasi dilakukan dengan memindahkan “decimal point” dari suatu nilai pada data. Normalisasi data dengan teknik ini dilakukan dengan membagi setiap nilai pada data dengan nilai absolut maksimum pada data. Nilai vi pada data dinormalisasi menjadi videngan menggunakan rumus berikut:
dimana j adalah nilai integer terkecil dengan nlai maksimum kurang dari 1 (max(|vi’|)<1.

Misalkan data input kita: -10, 201, 301, -401, 501, 601, 801. Hasil normalisasi data diatas dihasilkan dari
Langkah 1               : Nilai absolut maksimum dalam data adalah 701
Langkah 2               : Membagi data yang tersedia dengan 1000 (j = 3)
Hasil                      : Hasil normalisasi data tersebut adalah: -0.01, 0.201, 0.301, -0.401, 0.501, 0.601, 0.701

2.    Min-Max Normalization
Dalam teknik data normalisasi, transformasi linear dilakukan pada data asli. Nilai maksimum dan minimum dari data dipertimbangkan dalam rumus berikut.
dimana,
A                                                   : data atribut
Min(A), Max(A)                           : nilai maksimum dan minimum dari A
v'                                                   : nilai baru dari setiap data masukan
v                                                    : nilai lama dari setiap data masukan
new_max(A), new_min(A)      : nilai maksimum dan minimum dalam range nilai tersebut

3.       z-Score Normalization (zero-mean Normalization)
Dalam teknik ini, normalisasi data didasarkan pada nilai rata-rata (mean) dan standar deviasi (standard deviation) dari data dengan rumus berikut:
dimana,
v', v           : nilai data baru dan lama
σA              : standar deviasi
A               : nilai rata-rata A
4.       Normalisasi
       Salah satu teknik normalisasi lain dilakukan dengan rumus berikut:
            atau,
Sementara itu, standardisasi adalah proses menjadikan variabel-variabel menjadi skala yang sama. Secara umum memiliki tujuan yang sama dengan normalisasi namun tekniknya yang berbeda. Standardisasi dilakukan dengan salah satu metode berikut (dikutip dari support.minitab.com):

1.       Mengurangi nilainya dengan rata-rata dan dibagi dengan standar deviasi

2.       Mengurangi nilainya dengan rata-rata 

3.       Membaginya dengan standar deviasi

Nah sekarang sudah tahu kan bagaimana cara menormalisasi atau men-standardisasi data-data yang kita miliki sebelum dilakukan pengolahan dengan PNN dan CPNN? Yang perlu kita ingat sekali lagi adalah normalisasi tidak sama dengan standardisasi. Lantas pilih normalisasi atau standardisasi? Bebas. Keduanya memiliki tujuan yang sama, jadi silakan bisa memilih untuk menormalisasi atau men-standardisasi data asalkan konsisten dengan metodenya. Normalisasi atau standardisasi tidak akan mengubah bentuk data, hanya nilainya saja yang berubah sesuai dengan metode yang kita kehendaki. Hasilnya, setelah dilakukan normalisasi/standardisasi pada data maka kita dapat membandingkan data-data tersebut dan satuan dari data tersebut “hilang”. Okay, see you on my next post!