Algoritma GRNN (General Regression Neural Network) adalah salah satu algoritma berbasis jaringan saraf yang dapat digunakan untuk pengambilan keputusan. Contoh yang dibahas kali ini adalah mengenai penentuan penerimaan pengajuan kredit sepeda motor baru berdasarkan kelompok data yang sudah ada.
Cara kerja algoritma ini mirip seperti Algoritma Perceptron, tetapi tujuan utama dalam proses pelatihan adalah untuk mendapatkan nilai sigma yang memiliki nilai kesalahan terendah. Setelah mendapatkan nilai sigma, maka semua data akan dihitung nilai outputnya dengan menggunakan nilai sigma tersebut, dan kemudian nilai output diproses sesuai dengan kebutuhan.
Diasumsikan ada 8 data pelanggan yang sudah diketahui datanya, yaitu Pelanggan A,B,C,D,E,F,G,H
Masing-masing pelanggan memiliki kriteria, yaitu umur, jenis kelamin, skor kepribadian, dan memiliki nilai hasil yaitu Diterima / Ditolak
Diasumsikan 8 data tersebut adalah sebagai berikut:
Pelanggan | Umur | Jenis Kelamin | Skor Kepribadian | Hasil |
---|---|---|---|---|
Pelanggan A | 44 | Laki-laki | 3.55 | Diterima |
Pelanggan B | 52 | Perempuan | 4.71 | Diterima |
Pelanggan C | 60 | Perempuan | 6.56 | Ditolak |
Pelanggan D | 56 | Laki-laki | 6.8 | Ditolak |
Pelanggan E | 51 | Laki-laki | 6.94 | Ditolak |
Pelanggan F | 46 | Perempuan | 6.52 | Ditolak |
Pelanggan G | 48 | Laki-laki | 4.25 | Diterima |
Pelanggan H | 58 | Perempuan | 5.71 | Diterima |
Contoh data awal adalah sebagai berikut:
Untuk Kriteria Jenis Kelamin:
Laki-laki dilambangkan dengan angka -1
Perempuan dilambangkan dengan angka +1
Untuk kriteria Nilai Hasil:
Jika kondisi Diterima, maka inputan data kolom adalah 1
Jika kondisi Ditolak, maka inputan data kolom adalah 0
Dim data(9)() As Double data(0) = New Double() {44, -1, 3.55, 1} data(1) = New Double() {52, +1, 4.71, 1} data(2) = New Double() {60, +1, 6.56, 0} data(3) = New Double() {56, -1, 6.8 , 0} data(4) = New Double() {51, -1, 6.94, 0} data(5) = New Double() {46, +1, 6.52, 0} data(6) = New Double() {48, -1, 4.25, 1} data(7) = New Double() {58, +1, 5.71, 1}
Selanjutnya ada 2 orang pelanggan baru yang mengajukan kredit sepeda motor
Maka tentukan pelanggan ini nantinya akan termasuk dalam kelompok Diterima / Ditolak
Diasumsikan data awalnya adalah sebagai berikut:
Pelanggan I | 47 | Perempuan | 6.05 |
Pelanggan J | 52 | Laki-Laki | 5 |
Contoh data baru adalah sebagai berikut:
Untuk kriteria Nilai Hasil:
Karena belum diketahui nilai hasilnya, maka semua inputan data adalah -1
data(8) = New Double() {47, +1, 6.05, -1} data(9) = New Double() {52, -1, 5, -1}
Sebelum masuk kedalam langkah-langkah pembahasan algoritma, ada beberapa konstanta atau parameter yang harus diketahui, yaitu:
* Tentukan jumlah maksimal perulangan / epoch yang digunakan dalam perhitungan
Diasumsikan dalam kasus ini, jumlah maksimal perulangan adalah 100 kali
Const maksEpoch As Integer = 100
* Tentukan daftar nilai sigma yang akan dicari nilai optimalnya
Diasumsikan dalam kasus ini akan digunakan semua nilai sigma antara -10 sampai dengan +10 dengan interval 0.5
Dim daftarSigma As New List(Of Double) For i As Double = -10 To 10 Step 0.5 daftarSigma.Add(i) Next
Langkah-langkah penggunaan algoritma ini adalah
1. Lakukan normalisasi data untuk kriteria Umur dan Skor Kepribadian
Penjelasan lebih lanjut dapat dilihat pada penjelasan skrip dibawah ini (poin 1a – 1c)
1a. Hitung nilai rata-rata tiap-tiap kolom
yaitu dengan rumus: jumlah semua data dibagi dengan jumlah datanya
Dim total As Double = 0.0 For r = 0 To jumlahBaris - 1 total += data(r)(c) Next r Dim rata2 As Double = total / jumlahBaris hasil(0)(c) = rata2
1b. Hitung nilai standar deviasi tiap-tiap kolom
yaitu dengan rumus: akar dari ((kuadrat dari (jumlah dari (data – rata-rata))) / jumlah data)
Dim totalKuadrat As Double = 0.0 For r = 0 To jumlahBaris - 1 totalKuadrat += (data(r)(c) - rata2) * (data(r)(c) - rata2) Next r Dim stdDev As Double = Math.Sqrt(totalKuadrat / jumlahBaris) hasil(1)(c) = stdDev
1c. Normalisasi data dihitung dengan rumus (data – (rata-rata kriteria tersebut)) / standar deviasi kriteria tersebut
For c = 0 To kolom.Length - 1 Dim j As Integer = kolom(c) Dim rata2 As Double = hasil(0)(j) Dim stdDev As Double = hasil(1)(j) For i = 0 To jumlahBaris - 1 data(i)(j) = (data(i)(j) - rata2) / stdDev Next i Next c
2. Lakukan proses perhitungan inti untuk mendapatkan nilai sigma terbaik
Penjelasan lebih detail tentang fungsi ini dapat dilihat pada penjelasan skrip dibawah ini
Dim sigma As Double = ProsesPerhitungan(contohData, maksEpoch, daftarSigma)
2a. Lakukan perulangan sebanyak jumlah maksimal perulangan yang ada
Dim epoch As Integer = 0 While epoch < maksEpoch epoch += 1 . . .
2a1. Lakukan pembagian data kedalam 2 bagian secara acak
Setengah data pertama akan dianggap sebagai data latih
dan setengah data kedua akan dianggap sebagai data uji
Dim idxAcak(contohData.Length - 1) As Integer For i = 0 To contohData.Length - 1 idxAcak(i) = i Next For i = 0 To contohData.Length - 1 ' Teknik pengacakan menggunakan Fisher-Yates (Knuth) Dim r As Integer = rnd.Next(i, contohData.Length) Dim temp As Integer = idxAcak(r) idxAcak(r) = idxAcak(i) idxAcak(i) = temp Next i Dim tmpDataLatih(contohData.Length / 2 - 1)() As Double For i As Integer = 0 To contohData.Length / 2 - 1 tmpDataLatih(i) = contohData(idxAcak(i)) Next Dim tmpDataUji(contohData.Length / 2 - 1)() As Double Dim outputDataUji(contohData.Length / 2 - 1) As Double For i As Integer = contohData.Length / 2 To contohData.Length - 1 tmpDataUji(i - contohData.Length / 2) = New Double(contohData(i).Length - 2) {} For j As Integer = 0 To contohData(i).Length - 2 tmpDataUji(i - contohData.Length / 2)(j) = contohData(idxAcak(i))(j) Next outputDataUji(i - contohData.Length / 2) = contohData(idxAcak(i))(contohData(idxAcak(i)).Length - 1) Next Dim tmpMSE(daftarSigma.Count - 1) As Double Dim MSETerendah As Double = Double.MaxValue Dim idxMSETerendah As Integer = -1
2a2. Lakukan perhitungan menggunakan nilai sigma secara berurutan untuk mencari nilai sigma terbaik
For i As Integer = 0 To daftarSigma.Count - 1 . . .
2a2a. Lakukan perhitungan nilai output data uji sebenarnya menggunakan data latih yang telah dipilih sebelumnya
Penjelasan lebih detail tentang fungsi ini akan dijelaskan pada perhitungan dibawah ini
Dim hasilPerhitungan() As Double = hitungNilaiOutput(daftarSigma(i), tmpDataLatih, tmpDataUji)
* Gunakan fungsi ini untuk menghitung prediksi dari data yang tersedia
Inti perhitungan nilai output adalah menggunakan 2 buah rumus untuk mencari nilai d dan w
nilai d dihitung dengan rumus di = E((x-xj)^2)
nilai w dihitung dengan rumus wj = e^(-di/(2sig^2))
Penjelasan lebih detail tentang fungsi ini dapat dilihat pada penjelasan skrip dibawah ini
Private Function hitungNilaiOutput(sigma As Double, dataLatih As Double()(), dataUji As Double()()) As Double() Dim output(dataUji.Length - 1) As Double ' Dapatkan nilai kriteria input dan output dari data latih ' Nilai kriteria input yaitu semua kolom kriteria selain kolom terakhir pada data latih tersebut ' Nilai kriteria output yaitu kolom kriteria terakhir pada data latih tersebut Dim inputDataLatih(dataLatih.Length - 1)() As Double Dim outputDataLatih(dataLatih.Length - 1)() As Double For i As Integer = 0 To dataLatih.Length - 1 inputDataLatih(i) = New Double(dataLatih(i).Length - 2) {} outputDataLatih(i) = New Double(0) {} For j As Integer = 0 To dataLatih(i).Length - 2 inputDataLatih(i)(j) = dataLatih(i)(j) Next outputDataLatih(i)(0) = dataLatih(i)(dataLatih(i).Length - 1) Next ' Lakukan perhitungan pada masing-masing data uji For i As Integer = 0 To dataUji.Length - 1 Dim d(dataUji.Length - 1) As Double Dim w(dataLatih.Length - 1) As Double ' Hitung d dengan rumus: di = E((x-xj)^2) ' Hitung w dengan rumus: wj = e^(-di/(2sig^2)) For j As Integer = 0 To dataLatih.Length - 1 For k As Integer = 0 To dataUji(i).Length - 1 d(i) = Math.Pow(dataUji(i)(k) - dataLatih(j)(k), 2) w(j) += Math.Exp(-d(i) / (2 * Math.Pow(sigma, 2))) Next Next ' Dapatkan nilai numerator dengan menjumlahkan semua bobot * nilai output data latih ' Dapatkan nilai denominator dengan menjumlahkan semua bobot Dim numerator As Double = 0 Dim denominator As Double = 0 For j As Integer = 0 To dataLatih.Length - 1 numerator += w(j) * outputDataLatih(j)(0) denominator += w(j) Next ' Nilai output sebenarnya adalah numerator / denominator output(i) = numerator / denominator Next Return output End Function
2a2b. Hitung MSE antara nilai output data uji dengan nilai output data uji sebenarnya menggunakan nilai sigma yang terpilih
Hitung jarak Euclidean antara data input dan bobot output
Dim total As Double = 0 For j As Integer = 0 To hasilPerhitungan.Length - 1 total += Math.Pow(outputDataUji(j) - hasilPerhitungan(j), 2) Next tmpMSE(i) = Math.Sqrt(total)
2a2c. Dapatkan nilai MSE terendah
If tmpMSE(i) < MSETerendah Then MSETerendah = tmpMSE(i) idxMSETerendah = i End If
2a3. Simpan nilai sigma yang memiliki MSE terendah sebagai jawaban
daftarMSE.Add(MSETerendah) daftarHasilSigma.Add(daftarSigma(idxMSETerendah))
2b. Hitung jumlah kemunculan nilai sigma dari perhitungan tersebut
Sebagai contoh jika daftar nilai sigma bernilai 0.5, 0.6, 0.5
Maka jumlah data 0.5 adalah 2, dan jumlah data 0.6 adalah 1
Dim maksSigma As Double = Double.MinValue Dim idxSigma As Integer = -1 Dim tmpJumlahSigma(daftarSigma.Count - 1) As Integer For j As Integer = 0 To daftarHasilSigma.Count - 1 For k As Integer = 0 To daftarSigma.Count - 1 If daftarHasilSigma(j) = daftarSigma(k) Then tmpJumlahSigma(k) += 1 If tmpJumlahSigma(k) > maksSigma Then maksSigma = daftarSigma(k) idxSigma = k End If Exit For End If Next Next
3. Lakukan perhitungan dari masing-masing contoh data menggunakan nilai bobot dan nilai bias yang sudah ditemukan
Penjelasan tentang fungsi ini sudah dijelaskan pada perhitungan sebelumnya
Dim output() As Double = hitungNilaiOutput(sigma, contohData, tmpDataUji) Console.Write(output.ToString("F4") & " ")
4. Jika nilai output bernilai kurang dari 0.5 maka pelanggan tersebut memiliki nilai hasil Ditolak
Jika nilai output bernilai lebih dari 0.5 maka pelanggan tersebut memiliki nilai hasil Diterima
Kemudian bandingkan nilai output dengan nilai hasil pada contoh data
Jika hasilnya sudah sama, maka catat data ini kedalam jumlah data benar
Jika hasilnya tidak sama, maka catat data ini kedalam jumlah data salah
If output(0) <= 0.5 Then Console.Write("-> Ditolak ") If contohData(i)(jumlahKolom - 1) = 0 Then jumlahBenar += 1 Console.WriteLine("Benar") ElseIf contohData(i)(jumlahKolom - 1) <> 0 Then jumlahSalah += 1 Console.WriteLine("Salah") End If Else Console.Write("-> Diterima ") If contohData(i)(jumlahKolom - 1) = 0 Then jumlahSalah += 1 Console.WriteLine("Salah") ElseIf contohData(i)(jumlahKolom - 1) <> 0 Then jumlahBenar += 1 Console.WriteLine("Benar") End If End If
5. Catat tingkat kecocokan perhitungan data dengan hasil awal pada data
Langkah ini tidak wajib, hanya untuk mengetahui seberapa besar tingkat kecocokan perhitungan untuk data baru yang akan dihitung selanjutnya
Console.WriteLine("Jumlah perhitungan benar = " & jumlahBenar & ", jumlah perhitungan salah = " & jumlahSalah) Console.WriteLine("Tingkat kecocokan perhitungan dengan hasil data adalah " & (jumlahBenar / (jumlahBenar + jumlahSalah)).ToString("F2"))
6. Lakukan perhitungan yang sama (poin 3 dan 4) untuk masing-masing data baru
For i As Integer = 0 To dataBaru.Length - 1 Console.Write("Pelanggan " & Chr(i + 65 + 8) & " ") Dim input(jumlahKolom - 2) As Double Array.Copy(dataBaru(i), input, jumlahKolom - 1) For j = 0 To input.Length - 1 Console.Write(IIf(input(j) >= 0, " ", "") & input(j).ToString("F2") & " ") Next j Console.Write(" ") Dim tmpDataUji(0)() As Double tmpDataUji(0) = New Double(dataBaru(i).Length - 2) {} For j As Integer = 0 To dataBaru(i).Length - 2 tmpDataUji(0)(j) = dataBaru(i)(j) Next Dim output() As Double = hitungNilaiOutput(sigma, contohData, tmpDataUji) Console.Write(output(0).ToString("F4") & " ") If output(0) <= 0.5 Then Console.Write("-> Ditolak ") Else Console.Write("-> Diterima") End If Console.WriteLine("") Next
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.