Algoritma GRNN (General Regression Neural Network)


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:

PelangganUmurJenis KelaminSkor KepribadianHasil
Pelanggan A44Laki-laki3.55Diterima
Pelanggan B52Perempuan4.71Diterima
Pelanggan C60Perempuan6.56Ditolak
Pelanggan D56Laki-laki6.8Ditolak
Pelanggan E51Laki-laki6.94Ditolak
Pelanggan F46Perempuan6.52Ditolak
Pelanggan G48Laki-laki4.25Diterima
Pelanggan H58Perempuan5.71Diterima

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 I47Perempuan6.05
Pelanggan J52Laki-Laki5

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.

Tinggalkan sebuah komentar

Alamat email Anda tidak akan dipublikasikan. Ruas yang wajib ditandai *