Algoritma RBM (Restricted Boltzmann Machine) adalah salah satu algoritma berbasis jaringan yang dapat digunakan untuk pengambilan keputusan. Contoh yang dibahas kali ini adalah mengenai penentuan penyakit berdasarkan gejala yang tersedia.
Algoritma ini memiliki kemiripan dengan algoritma berbasis jaringan saraf pada umumnya, hanya saja dalam struktur jaringan ini tidak ada istilah input dan output, hal ini disebabkan karena arus perpindahan data terjadi secara 2 arah. Oleh sebab itu dalam struktur jaringannya hanya terdapat 2 macam node, yaitu node terlihat / tampak, dan node tidak terlihat / tersembunyi. Karena arus datanya terjadi secara 2 arah, apabila input A menghasilkan output B, maka apabila nilai B dimasukkan sebagai output dan dilacak balik, maka akan hampir selalu menghasilkan input A.
Diketahui terdapat 2 jenis penyakit, yaitu penyakit A dan B
Penyakit A memiliki gejala batuk, pilek, demam
Penyakit B memiliki gejala pusing, mual, diare
Diasumsikan terdapat 10 data gejala yang dialami pasien dengan data sebagai berikut
Nama Pasien | Batuk | Pilek | Demam | Pusing | Mual | Diare |
---|---|---|---|---|---|---|
Pasien A | 1 | 1 | 1 | 0 | 0 | 0 |
Pasien B | 0 | 0 | 0 | 1 | 1 | 1 |
Pasien C | 1 | 1 | 0 | 0 | 0 | 0 |
Pasien D | 0 | 0 | 0 | 0 | 1 | 1 |
Pasien E | 1 | 0 | 1 | 0 | 1 | 0 |
Pasien F | 0 | 1 | 0 | 1 | 0 | 1 |
Pasien G | 1 | 1 | 1 | 0 | 0 | 1 |
Pasien H | 1 | 0 | 0 | 1 | 1 | 1 |
Pasien I | 0 | 0 | 1 | 0 | 0 | 0 |
Pasien J | 0 | 0 | 0 | 1 | 0 | 0 |
Contoh data awal adalah sebagai berikut:
Dim contohData()() As Integer = New Integer()() { _
New Integer() {1, 1, 1, 0, 0, 0},
New Integer() {0, 0, 0, 1, 1, 1},
New Integer() {1, 1, 0, 0, 0, 0},
New Integer() {0, 0, 0, 0, 1, 1},
New Integer() {1, 0, 1, 0, 1, 0},
New Integer() {0, 1, 0, 1, 0, 1},
New Integer() {1, 1, 1, 0, 0, 1},
New Integer() {1, 0, 0, 1, 1, 1},
New Integer() {0, 0, 1, 0, 0, 0},
New Integer() {0, 0, 0, 1, 0, 0}
}
Selanjutnya ada 2 orang pasien baru yang memiliki gejala yang berbeda dengan data yang tersedia
Maka tentukan jenis penyakit untuk pasien ini
Diasumsikan data pasien tersebut adalah sebagai berikut:
Nama Pasien | Batuk | Pilek | Demam | Pusing | Mual | Diare |
---|---|---|---|---|---|---|
Pasien K | 1 | 1 | 1 | 0 | 0 | 0 |
Pasien L | 0 | 0 | 0 | 1 | 1 | 1 |
Contoh data baru adalah sebagai berikut:
Dim dataBaru()() As Integer = New Integer()() { _ New Integer() {1, 0, 0, 1, 0, 0}, New Integer() {1, 0, 0, 0, 0, 1} }
Sebelum masuk kedalam langkah-langkah pembahasan algoritma, ada beberapa konstanta atau parameter yang harus diketahui, yaitu:
* Tentukan Jumlah node tampak yang digunakan dalam sistem RBM
Diasumsikan dalam kasus ini jumlah node tampak adalah 6 node karena mengikuti jumlah gejala yang tersedia
Dim jumlahNodeTampak As Integer = 6
* Tentukan Jumlah node tersembunyi yang digunakan dalam sistem RBM
Diasumsikan dalam kasus ini jumlah node tersembunyi adalah 2 node karena mengikuti jumlah penyakit yang tersedia
Dim jumlahNodeTersembunyi As Integer = 2
* Tentukan rasio pembelajaran yang digunakan pada saat tahap pelatihan
Diasumsikan dalam kasus ini nilai rasio pembelajaran adalah 0.01
Semakin rendah nilainya, maka proses pelatihan akan membutuhkan waktu yang semakin lama,
Tetapi semakin tinggi nilainya, maka proses pelatihan tidak akan dapat menemukan nilai yang diperkirakan bisa lebih baik
Dim rasioPembelajaran As Double = 0.01
* Tentukan jumlah iterasi yang digunakan pada saat tahap pelatihan
Diasumsikan dalam kasus ini jumlah iterasi adalah 1000
Dim jumlahIterasi As Integer = 1000
Langkah-langkah penggunaan algoritma ini adalah
1. Lakukan proses pencarian nilai bobot dan bias terbaik
Metode yang digunakan adalah RBM (Restricted Boltzmann Machine) dengan teknik pelatihan menggunakan algoritma CD-1 (Contrastive Divergence, single-step)
Penjelasan lebih detail tentang fungsi pelatihan akan dijelaskan pada perhitungan dibawah ini
Dim rbm As New RBM(jumlahNodeTampak, jumlahNodeTersembunyi) rbm.prosesPelatihan(contohData, rasioPembelajaran, jumlahIterasi)
Memasuki perhitungan utama dari proses pelatihan RBM
1a. Inisialisasi indeks urutan data
Dim idxAcak(dataLatih.Length - 1) As Integer For i = 0 To idxAcak.Length - 1 idxAcak(i) = i Next i
* Lakukan perhitungan sebanyak jumlah iterasi
Dim epoch As Integer = 0 Do While epoch < jumlahIterasi . . .
1b. Lakukan pengacakan indeks urutan data
agar data yang diambil tidak selalu berurutan dari awal sampai akhir
For i = 0 To idxAcak.Length - 1 Dim ri As Integer = rnd.Next(i, idxAcak.Length) Dim tmp As Integer = idxAcak(i) idxAcak(i) = idxAcak(ri) idxAcak(ri) = tmp Next i
* Lakukan perhitungan sesuai dengan urutan data yang telah diacak
For idx = 0 To idxAcak.Length - 1 Dim i As Integer = idxAcak(idx) . . .
1c. Masukkan nilai dari data latih terpilih ke dalam node tampak
For j = 0 To jumlahNodeTampak - 1 daftarNilaiNodeTampak(j) = dataLatih(i)(j) Next j
1d. Hitung masing-masing nilai node tersembunyi apabila menggunakan nilai input node tampak
* Hitung total perkalian antara node tampak dengan bobotTT nya
* Tambahkan nilai bias
* Dapatkan nilai probabilitas dengan menggunakan fungsi sigmoid
* Bangkitkan nilai acak dan tentukan nilai jawaban berdasarkan probabilitas tersebut
For h = 0 To jumlahNodeTersembunyi - 1 Dim total As Double = 0.0 For v = 0 To jumlahNodeTampak - 1 total += daftarNilaiNodeTampak(v) * bobotTT(v)(h) Next total += daftarBiasNodeTersembunyi(h) daftarProbabilitasNodeTersembunyi(h) = Sigmoid(total) Dim prob As Double = rnd.NextDouble If daftarProbabilitasNodeTersembunyi(h) > prob Then daftarNilaiNodeTersembunyi(h) = 1 Else daftarNilaiNodeTersembunyi(h) = 0 End If Next h
* Gunakan fungsi ini untuk menghitung nilai fungsi Sigmoid, yang diperoleh dengan rumus:
f(x) = 1.0 / (1.0 + Exp(-x))
Public Function Sigmoid(ByVal x As Double) As Double If x < -20.0 Then Return 0.0000000001 ElseIf x > 20.0 Then Return 0.9999999999 Else Return 1.0 / (1.0 + Math.Exp(-x)) End If End Function
1e. Hitung nilai gradien positif, yaitu operasi outer product dari node tampak dan node tersembunyi
Dim gradienPositif()() As Integer = OperasiOuterProduct(daftarNilaiNodeTampak, daftarNilaiNodeTersembunyi)
* Gunakan fungsi ini untuk melakukan operasi Outer Product
Public Shared Function OperasiOuterProduct(ByVal nilaiNodeTampak() As Integer, ByVal nilaiNodeTersembunyi() As Integer) As Integer()() Dim jumlahBaris As Integer = nilaiNodeTampak.Length Dim jumlahKolom As Integer = nilaiNodeTersembunyi.Length Dim hasil(jumlahBaris - 1)() As Integer For i = 0 To jumlahBaris - 1 hasil(i) = New Integer(jumlahKolom - 1) {} Next i For i = 0 To jumlahBaris - 1 For j = 0 To jumlahKolom - 1 hasil(i)(j) = nilaiNodeTampak(i) * nilaiNodeTersembunyi(j) Next j Next i Return hasil End Function
1f. Lakukan perhitungan nilai node tampak apabila menggunakan nilai node tersembunyi yang baru saja didapatkan
* Hitung total perkalian antara node tersembunyi dengan bobotTT nya
* Tambahkan nilai bias
* Dapatkan nilai probabilitas dengan menggunakan fungsi sigmoid
* Bangkitkan nilai acak dan tentukan nilai jawaban berdasarkan probabilitas tersebut
Dim vPrime(jumlahNodeTampak - 1) As Integer For v = 0 To jumlahNodeTampak - 1 Dim total As Double = 0.0 For h = 0 To jumlahNodeTersembunyi - 1 total += daftarNilaiNodeTersembunyi(h) * bobotTT(v)(h) Next h total += daftarBiasNodeTampak(v) Dim probAktif As Double = Sigmoid(total) Dim prob As Double = rnd.NextDouble If probAktif > prob Then vPrime(v) = 1 Else vPrime(v) = 0 End If Next v
1g. Lakukan perhitungan nilai node tersembunyi apabila menggunakan nilai node tampak yang baru saja didapatkan
* Hitung total perkalian antara node tampak’ dengan bobotTT nya
* Tambahkan nilai bias
* Dapatkan nilai probabilitas dengan menggunakan fungsi sigmoid
* Bangkitkan nilai acak dan tentukan nilai jawaban berdasarkan probabilitas tersebut
Dim hPrime(jumlahNodeTersembunyi - 1) As Integer
For h = 0 To jumlahNodeTersembunyi - 1
Dim total As Double = 0.0
For v = 0 To jumlahNodeTampak - 1
total += vPrime(v) * bobotTT(v)(h)
Next v
total += daftarBiasNodeTersembunyi(h)
Dim probAktif As Double = Sigmoid(total)
Dim prob As Double = rnd.NextDouble
If probAktif > prob Then
hPrime(h) = 1
Else
hPrime(h) = 0
End If
Next h
1h. Hitung nilai gradien negatif, yaitu operasi outer product dari node tampak’ dan node tersembunyi’
Dim gradienNegatif()() As Integer = OperasiOuterProduct(vPrime, hPrime)
1i. Lakukan update nilai bobot dengan menggunakan rasio pembelajaran dan selisih antara nilai gradien positif dan negatif
For row = 0 To jumlahNodeTampak - 1 For col = 0 To jumlahNodeTersembunyi - 1 bobotTT(row)(col) += rasioPembelajaran * (gradienPositif(row)(col) - gradienNegatif(row)(col)) Next col Next row
1j. Lakukan update nilai bias node tampak dengan menggunakan rasio pembelajaran dan selisih antara nilai node tampak dan node tampak’
For v = 0 To jumlahNodeTampak - 1 daftarBiasNodeTampak(v) += rasioPembelajaran * (daftarNilaiNodeTampak(v) - vPrime(v)) Next v
1k. Lakukan update nilai bias node tersembunyi dengan menggunakan rasio pembelajaran dan selisih antara nilai node tersembunyi dan node tersembunyi’
For h = 0 To jumlahNodeTersembunyi - 1 daftarBiasNodeTersembunyi(h) += rasioPembelajaran * (daftarNilaiNodeTersembunyi(h) - hPrime(h)) Next h
* Setelah mendapatkan nilai bobot dan bias, maka lakukan perhitungan untuk masing-masing data baru
2. Lakukan perhitungan dari masing-masing data baru menggunakan nilai bobot dan bias yang sudah ditemukan
Penjelasan tentang fungsi ini akan dijelaskan pada perhitungan dibawah ini
Dim output() As Integer = rbm.hitungNodeTersembunyiDariNodeTampak(input)
* Gunakan fungsi ini untuk menghitung nilai node tersembunyi apabila menggunakan nilai node tampak
Public Function hitungNodeTersembunyiDariNodeTampak(ByVal nilaiNodeTampak() As Integer) As Integer() Dim hasil(jumlahNodeTersembunyi - 1) As Integer For h = 0 To jumlahNodeTersembunyi - 1 Dim total As Double = 0.0 For v = 0 To jumlahNodeTampak - 1 total += nilaiNodeTampak(v) * bobotTT(v)(h) Next v total += daftarBiasNodeTersembunyi(h) Dim probAktif As Double = Sigmoid(total) Dim prob As Double = rnd.NextDouble If probAktif > prob Then hasil(h) = 1 Else hasil(h) = 0 End If Next h Return hasil End Function
3. Hitung jumlah kriteria antara penyakit A dan B
Jika jumlah kriteria penyakit A lebih dari penyakit B, maka jawaban penyakit adalah penyakit B
Jika jumlah kriteria penyakit B lebih dari penyakit A, maka jawaban penyakit adalah penyakit A
Jika jumlah kriteria penyakit A sama dengan penyakit B, maka jawaban penyakit adalah penyakit A dan B
Selain itu, maka jawaban penyakit adalah tidak diketahui
Dim jumlahA As Integer = 0, jumlahB As Integer = 0 For j = 0 To output.Length - 1 Console.Write(" " & output(j)) If output(j) > 0 Then If j <= output.Length / 2 - 1 Then jumlahA += 1 Else jumlahB += 1 End If End If Next j Console.Write(" ") If jumlahA > jumlahB Then Console.Write("-> Penyakit A") ElseIf jumlahB > jumlahA Then Console.Write("-> Penyakit B") ElseIf jumlahA > 0 & jumlahB > 0 Then Console.Write("-> Penyakit A dan B") Else Console.Write("-> Tidak Diketahui") End If Console.WriteLine("")
Hasil akhir adalah: (klik untuk perbesar gambar)
Contoh modul / source code dalam bahasa VB (Visual Basic) dapat didownload disini:
Jika membutuhkan jasa kami dalam pembuatan program, keterangan selanjutnya dapat dilihat di Fasilitas dan Harga
Jika ada yang kurang paham dengan langkah-langkah algoritma diatas, silahkan berikan komentar Anda.
Selamat mencoba.
kalau boleh tau sumber contoh perhitungannya mengambil darimana?
Mohon maaf saya sudah tidak mengingat sumber perhitungan untuk algoritma ini karena saya mempelajari algoritma ini beberapa tahun lalu.
apakah ada dengan bahasa pemrograman python untuk menyelaskan masalah ini?
Saya tidak memiliki contoh skrip dalam bahasa python, tetapi jika saya melihat alur kerja skrip yang saya bagikan diatas, seharusnya tidak ada masalah apabila dikonversi ke dalam bahasa lain termasuk python karena implementasi tidak bergantung pada library atau plugin tertentu.