Algoritma Back-Propagation 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.
Secara singkat, struktur utama algoritma ini adalah Algoritma JST (Jaringan Saraf Tiruan). Pada contoh yang sebelumnya, teknik pencarian matriks bobot dilakukan dengan metode PSO (Particle Swarm Optimization), sedangkan pada contoh yang dibahas kali ini, teknik yang digunakan adalah teknik Gradient Descent. Sehingga Algoritma Back-Propagation adalah penggabungan antara 2 metode tersebut.
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 pelanggan awal adalah sebagai berikut:
Untuk Kriteria Jenis Kelamin:
Laki-laki dilambangkan dengan angka -1
Perempuan dilambangkan dengan angka +1
Untuk kriteria Nilai Hasil:
Terdapat 2 kolom untuk merepresentasikan kondisi Diterima dan Ditolak
Jika kondisi Diterima, maka inputan data kolom adalah 1, 0
Jika kondisi Ditolak, maka inputan data kolom adalah 0, 1
Dim data(9)() As Double data(0) = New Double() {44, -1, 3.55, 1, 0} data(1) = New Double() {52, +1, 4.71, 1, 0} data(2) = New Double() {60, +1, 6.56, 0, 1} data(3) = New Double() {56, -1, 6.8, 0, 1} data(4) = New Double() {51, -1, 6.94, 0, 1} data(5) = New Double() {46, +1, 6.52, 0, 1} data(6) = New Double() {48, -1, 4.25, 1, 0} data(7) = New Double() {58, +1, 5.71, 1, 0}
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 pelanggan baru adalah sebagai berikut:
Untuk kriteria Nilai Hasil:
Terdapat 2 kolom untuk merepresentasikan kondisi Diterima dan Ditolak
Karena belum diketahui nilai hasilnya, maka semua inputan data adalah -1, -1
data(8) = New Double() {47, +1, 6.05, -1, -1} data(9) = New Double() {52, -1, 5, -1, -1}
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. Tentukan skema awal untuk algoritma ini.
Algoritma ini dapat digunakan untuk melakukan perhitungan yang memiliki banyak input dan menghasilkan banyak output
Diasumsikan dalam kasus ini, skema yang digunakan adalah 3 – 4 – 2, dimana:
- 3 adalah jumlah saraf input, karena ada 3 kriteria awal, yaitu Umur, Jenis Kelamin, dan Skor Kepribadian
- 4 adalah jumlah saraf tersembunyi yang digunakan. Jumlah saraf tersembunyi harus lebih dari jumlah saraf input
dalam kasus ini bisa lebih dari 4, tetapi hanya digunakan 4 saja untuk mempercepat perhitungan
- 2 adalah jumlah saraf output, Karena kriteria nilai hasil bergantung pada nilai 2 kolom, yaitu 1,0 jika diterima dan 0,1 jika ditolak
Const jumlahSarafInput As Integer = 3 Const jumlahSarafTersembunyi As Integer = 4 Const jumlahSarafOutput As Integer = 2 Dim jst As New JaringanSaraf(jumlahSarafInput, jumlahSarafTersembunyi, jumlahSarafOutput)
* Diperlukan sebuah class untuk menyimpan semua matriks data untuk digunakan dalam perhitungan algoritma ini. Class ini dinamakan class JaringanSaraf. Deklarasi awal untuk setiap pengisian data adalah sebagai berikut
Public Class JaringanSaraf Private Shared rnd As Random Private jumlahSarafInput As Integer Private jumlahSarafTersembunyi As Integer Private jumlahSarafOutput As Integer Private inputs As Double() 'Matriks data untuk perhitungan jaringan saraf input-tersembunyi Private ihBobot As Double()() 'Nilai bobot pada jaringan saraf input-tersembunyi Private hBias As Double() 'Nilai bias pada jaringan saraf tersembunyi Private hOutput As Double() 'Nilai output sementara pada jaringan saraf tersembunyi 'Matriks data untuk perhitungan jaringan saraf tersembunyi-output Private hoBobot As Double()() 'Nilai bobot pada jaringan tersembunyi-output Private oBias As Double() 'Nilai bias pada jaringan saraf output Private outputs As Double() 'Matriks data untuk menyimpan nilai gradien Private hGradient As Double() 'Nilai gradien pada jaringan saraf tersembunyi Private oGradient As Double() 'Nilai gradien pada jaringan saraf output 'Matriks data untuk menyimpan nilai bobot untuk digunakan pada perhitungan momentum Private ihDeltaBobotSebelumnya As Double()() 'Nilai delta bobot sebelumnya pada jaringan saraf input-tersembunyi Private hDeltaBiasSebelumnya As Double() 'Nilai delta bias sebelumnya pada jaringan saraf tersembunyi Private hoDeltaBobotSebelumnya As Double()() 'Nilai delta bobot sebelumnya pada jaringan saraf tersembunyi-output Private oDeltaBiasSebelumnya As Double() 'Nilai delta bias sebelumnya pada jaringan saraf output Public Sub New(jumlahSarafInput As Integer, jumlahSarafTersembunyi As Integer, jumlahSarafOutput As Integer) rnd = New Random(0) Me.jumlahSarafInput = jumlahSarafInput Me.jumlahSarafTersembunyi = jumlahSarafTersembunyi Me.jumlahSarafOutput = jumlahSarafOutput Me.inputs = New Double(jumlahSarafInput - 1) {} Dim ihBobot As Double()() = New Double(jumlahSarafInput - 1)() {} For r As Integer = 0 To ihBobot.Length - 1 ihBobot(r) = New Double(jumlahSarafTersembunyi - 1) {} Next Me.ihBobot = ihBobot Me.hBias = New Double(jumlahSarafTersembunyi - 1) {} Me.hOutput = New Double(jumlahSarafTersembunyi - 1) {} Dim hoBobot As Double()() = New Double(jumlahSarafTersembunyi - 1)() {} For r As Integer = 0 To hoBobot.Length - 1 hoBobot(r) = New Double(jumlahSarafOutput - 1) {} Next Me.hoBobot = hoBobot Me.oBias = New Double(jumlahSarafOutput - 1) {} Me.outputs = New Double(jumlahSarafOutput - 1) {} Me.hGradient = New Double(jumlahSarafTersembunyi - 1) {} Me.oGradient = New Double(jumlahSarafOutput - 1) {} Dim ihDeltaBobotSebelumnya As Double()() = New Double(jumlahSarafInput - 1)() {} For r As Integer = 0 To ihDeltaBobotSebelumnya.Length - 1 ihDeltaBobotSebelumnya(r) = New Double(jumlahSarafTersembunyi - 1) {} Next Me.ihDeltaBobotSebelumnya = ihDeltaBobotSebelumnya Me.hDeltaBiasSebelumnya = New Double(jumlahSarafTersembunyi - 1) {} Dim hoDeltaBobotSebelumnya As Double()() = New Double(jumlahSarafTersembunyi - 1)() {} For r As Integer = 0 To hoDeltaBobotSebelumnya.Length - 1 hoDeltaBobotSebelumnya(r) = New Double(jumlahSarafOutput - 1) {} Next Me.hoDeltaBobotSebelumnya = hoDeltaBobotSebelumnya Me.oDeltaBiasSebelumnya = New Double(jumlahSarafOutput - 1) {} End Sub . . . End Class
* Setelah melakukan inisialisasi diatas, maka akan dilakukan inisialisasi matriks bobot dan bias yang digunakan
- jumlah nilai bobot pada jaringan saraf input-tersembunyi adalah jumlah saraf input * jumlah saraf tersembunyi (3 * 4 = 12 buah)
- jumlah nilai bias pada jaringan saraf input-tersembunyi adalah jumlah saraf tersembunyi (4 buah)
- jumlah nilai bobot pada jaringan saraf tersembunyi-output adalah jumlah saraf tersembunyi * jumlah saraf output (4 * 2 = 8 buah)
- jumlah nilai bias pada jaringan saraf tersembunyi-output adalah jumlah saraf output (2 buah)
Sehingga, jumlah bobot yang diperlukan adalah 12 + 4 + 8 + 2 = 26 buah data
Kemudian pada masing-masing bobot, beri nilai awal dengan nilai acak yang sangat kecil (antara 0.001 sampai dengan 0.0001)
Dim jumlahBobot As Integer = (jumlahSarafInput * jumlahSarafTersembunyi) + (jumlahSarafTersembunyi * jumlahSarafOutput) + jumlahSarafTersembunyi + jumlahSarafOutput Dim bobot As Double() = New Double(jumlahBobot - 1) {} Dim lo As Double = 0.0001 Dim hi As Double = 0.001 For i As Integer = 0 To bobot.Length - 1 bobot(i) = (hi - lo) * rnd.NextDouble() + lo Next Me.setBobot(bobot)
* Gunakan fungsi ini untuk memasukkan matriks bobot awal kedalam 4 matriks data yaitu matriks ihBobot, hBias, hoBobot, oBias
ihBobot adalah matriks bobot pada jaringan saraf input-tersembunyi, dengan jumlah data = jumlah saraf input * jumlah saraf tersembunyi (3 * 4 = 12 buah)
hBias adalah matriks nilai bias pada jaringan saraf input-tersembunyi, dengan jumlah data = jumlah saraf tersembunyi (4 buah)
hoBobot adalah matriks bobot pada jaringan saraf tersembunyi-output, dengan jumlah data = jumlah saraf tersembunyi * jumlah saraf output (4 * 2 = 8 buah)
oBias adalah matriks nilai bias pada jaringan saraf tersembunyi-output, dengan jumlah data = jumlah saraf output (2 buah)
Public Sub setBobot(bobot As Double()) Dim jumlahBobot As Integer = (jumlahSarafInput * jumlahSarafTersembunyi) + (jumlahSarafTersembunyi * jumlahSarafOutput) + jumlahSarafTersembunyi + jumlahSarafOutput If bobot.Length <> jumlahBobot Then Throw New Exception("Pada fungsi SetBobot, panjang matriks bobot: " & bobot.Length & " tidak sama dengan jumlah bobot yang seharusnya, yaitu " & jumlahBobot) End If Dim k As Integer = 0 For i As Integer = 0 To jumlahSarafInput - 1 For j As Integer = 0 To jumlahSarafTersembunyi - 1 ihBobot(i)(j) = bobot(k) k += 1 Next Next For i As Integer = 0 To jumlahSarafTersembunyi - 1 hBias(i) = bobot(k) k += 1 Next For i As Integer = 0 To jumlahSarafTersembunyi - 1 For j As Integer = 0 To jumlahSarafOutput - 1 hoBobot(i)(j) = bobot(k) k += 1 Next Next For i As Integer = 0 To jumlahSarafOutput - 1 oBias(i) = bobot(k) k += 1 Next End Sub
3. Tentukan parameter-parameter yang digunakan dalam perhitungan
3a. Tentukan jumlah maksimal perulangan / epoch yang digunakan dalam perhitungan
Diasumsikan dalam kasus ini, jumlah maksimal perulangan adalah 500 kali
Const maksEpoch As Integer = 500
3b. Tentukan rasio pembelajaran untuk digunakan pada perhitungan matriks bobot
Semakin besar nilainya, maka semakin cepat nilai bobot akan berubah-ubah
Diasumsikan dalam kasus ini, rasio pembelajaran adalah 0.05
Const rasioPembelajaran As Double = 0.05
3c. Tentukan momentum, yaitu nilai tambahan yang akan ditambahkan pada setiap kali perulangan untuk mengupdate nilai bobot
Sama seperti variabel rasio pembelajaran, semakin besar nilainya, maka semakin cepat nilai bobot akan berubah-ubah
Diasumsikan dalam kasus ini, momentum adalah 0.01
Const momentum As Double = 0.01
4. Lakukan proses pencarian matriks bobot terbaik
Metode yang digunakan adalah Gradient Descent
Penjelasan lebih detail tentang fungsi ini dapat dilihat pada penjelasan skrip dibawah ini (poin 4a – 4c)
jst.BackProp(contohData, maksEpoch, rasioPembelajaran, momentum)
Memasuki perhitungan pada fungsi BackProp
* Lakukan perhitungan sebanyak parameter maksEpoch
Dim epoch As Integer = 0 While epoch < maksEpoch epoch += 1 . . .
4a. Hitung nilai kesalahan menggunakan teknik MSE (Mean Squared Error)
Jika nilai MSE sudah mendekati 0 maka perulangan akan dihentikan
Penjelasan lebih detail tentang fungsi ini dapat dilihat pada penjelasan skrip dibawah ini
Dim mse As Double = MeanSquaredError(contohData) If mse < 0.001 Then Exit While
* Gunakan fungsi ini untuk menghitung tingkat kesalahan dari masing-masing data input
Hitung tingkat kesalahan nilai jawaban menggunakan teknik Mean Squared Error
dihitung dengan rumus jumlah dari (kuadrat dari (nilai jawaban – nilai hasil pada matriks data)) / jumlah data
Nilai jawaban yang baru bisa jadi mengembalikan nilai MSE yang lebih tinggi, sehingga nilai jawaban ini tidak bisa dipakai
Private Function MeanSquaredError(contohData As Double()(), bobot As Double()) As Double Me.setBobot(bobot) Dim contohDataKolomKriteria As Double() = New Double(jumlahSarafInput - 1) {} Dim contohDataKolomHasil As Double() = New Double(jumlahSarafOutput - 1) {} Dim hasil As Double = 0.0 For i As Integer = 0 To contohData.Length - 1 Array.Copy(contohData(i), contohDataKolomKriteria, jumlahSarafInput) Array.Copy(contohData(i), jumlahSarafInput, contohDataKolomHasil, 0, jumlahSarafOutput) Dim dataKolomHasil As Double() = Me.ComputeOutputs(contohDataKolomKriteria) For j As Integer = 0 To dataKolomHasil.Length - 1 hasil += ((dataKolomHasil(j) - contohDataKolomHasil(j)) * (dataKolomHasil(j) - contohDataKolomHasil(j))) Next Next Return hasil / contohData.Length End Function
4b. Pada setiap kali perulangan, lakukan pengacakan urutan data
Sehingga perhitungan data tidak dimulai dari indeks terendah sampai ke indeks tertinggi
For i As Integer = 0 To urutanData.Length - 1 Dim r As Integer = rnd.[Next](i, urutanData.Length) Dim tmp As Integer = urutanData(r) urutanData(r) = urutanData(i) urutanData(i) = tmp Next
4c. Lakukan perhitungan pada masing-masing contoh data, sesuai dengan urutan acak sebelumnya
For i As Integer = 0 To contohData.Length - 1 Dim idx As Integer = urutanData(i) . . .
4c1. Lakukan perulangan pada setiap baris data
Ambil matriks data kolom kriteria dan kolom hasil sesuai urutan baris data yang sudah ditentukan sebelumnya
Kemudian hitung nilai output dari matriks data kolom kriteria
Array.Copy(contohData(idx), contohDataKolomKriteria, jumlahSarafInput) Array.Copy(contohData(idx), jumlahSarafInput, contohDataKolomHasil, 0, jumlahSarafOutput) hitungNilaiOutput(contohDataKolomKriteria)
4c2. Lakukan proses update nilai bobot untuk mendapatkan nilai bobot terbaik (poin 4c2a – 4c2f)
4c2a. Hitung nilai gradient pada jaringan saraf output
For j As Integer = 0 To oGradient.Length - 1 Dim turunanFungsiSoftmax As Double = (1 - outputs(j)) * outputs(j) oGradient(j) = turunanFungsiSoftmax * (contohDataKolomHasil(j) - outputs(j)) Next
4c2b. Hitung nilai gradient pada jaringan saraf tersembunyi
For j As Integer = 0 To hGradient.Length - 1 Dim turunanFungsiHyperTanFunction As Double = (1 - hOutput(j)) * (1 + hOutput(j)) Dim jumlahGradient As Double = 0.0 For k As Integer = 0 To jumlahSarafOutput - 1 Dim x As Double = oGradient(k) * hoBobot(j)(k) jumlahGradient += x Next hGradient(j) = turunanFungsiHyperTanFunction * jumlahGradient Next
4c2c. Lakukan update bobot pada matriks ihBobot pada jaringan saraf input-tersembunyi
Hitung nilai delta dengan rumus rasioPembelajaran * nilai gradient pada kolom ke k * data kolom kriteria ke j
Tambahkan pada matriks ihBobot
Kemudian tambahkan nilai momentum pada matriks ihBobot
For j As Integer = 0 To ihBobot.Length - 1 For k As Integer = 0 To ihBobot(0).Length - 1 Dim delta As Double = rasioPembelajaran * hGradient(k) * inputs(j) ihBobot(j)(k) += delta ihBobot(j)(k) += momentum * ihDeltaBobotSebelumnya(j)(k) ihDeltaBobotSebelumnya(j)(k) = delta Next Next
4c2d. Lakukan update bobot pada matriks hBias pada jaringan saraf tersembunyi
Hitung nilai delta dengan rumus rasioPembelajaran * nilai gradient pada kolom ke j
Tambahkan pada matriks hBias
Kemudian tambahkan nilai momentum pada matriks hBias
For j As Integer = 0 To hBias.Length - 1 Dim delta As Double = rasioPembelajaran * hGradient(j) * 1.0 hBias(j) += delta hBias(j) += momentum * hDeltaBiasSebelumnya(j) hDeltaBiasSebelumnya(j) = delta Next
4c2e. Lakukan update bobot pada matriks hoBobot pada jaringan saraf tersembunyi-output
Hitung nilai delta dengan rumus rasioPembelajaran * nilai gradient pada kolom ke k * data kolom hasil ke j
Tambahkan pada matriks hoBobot
Kemudian tambahkan nilai momentum pada matriks hoBobot
For j As Integer = 0 To hoBobot.Length - 1 For k As Integer = 0 To hoBobot(0).Length - 1 Dim delta As Double = rasioPembelajaran * oGradient(k) * hOutput(j) hoBobot(j)(k) += delta hoBobot(j)(k) += momentum * hoDeltaBobotSebelumnya(j)(k) ' save hoDeltaBobotSebelumnya(j)(k) = delta Next Next
4c2f. Lakukan update bobot pada matriks oBias pada jaringan saraf output
Hitung nilai delta dengan rumus rasioPembelajaran * nilai gradient pada kolom ke j
Tambahkan pada matriks oBias
Kemudian tambahkan nilai momentum pada matriks oBias
For j As Integer = 0 To oBias.Length - 1 Dim delta As Double = rasioPembelajaran * oGradient(j) * 1.0 oBias(j) += delta oBias(j) += momentum * oDeltaBiasSebelumnya(j) ' save oDeltaBiasSebelumnya(j) = delta Next
5. Lakukan perhitungan dari masing-masing contoh data menggunakan nilai bobot dan nilai bias yang sudah ditemukan
Penjelasan tentang fungsi ini akan dijelaskan pada perhitungan dibawah ini (poin 5a – 5g)
Dim output() As Double = jst.hitungNilaiOutput(input)
Memasuki perhitungan utama pada fungsi hitungNilaiOutput
5a. Beri nilai matriks input sesuai array input
For i = 0 To input.Length - 1 Me.inputs(i) = input(i) Next i
5b. Hitung matriks ihJumlahBobotDanBias dengan cara perkalian matriks antara matriks input dan matriks ihBobot
For j = 0 To jumlahSarafTersembunyi - 1 For i = 0 To jumlahSarafInput - 1 ihJumlahBobotDanBias(j) += Me.inputs(i) * ihBobot(i)(j) Next i Next j
5c. Kemudian masukkan nilai bias pada matriks ihJumlahBobotDanBias
For i = 0 To jumlahSarafTersembunyi - 1 ihJumlahBobotDanBias(i) += hBias(i) Next i
5d. Hitung nilai output sementara dengan menggunakan fungsi HyperTan untuk masing-masing data pada matriks hJumlahBobotDanBias
Penjelasan tentang fungsi HyperTan akan dijelaskan pada perhitungan dibawah ini
For i As Integer = 0 To jumlahSarafTersembunyi - 1 Me.hOutput(i) = HyperTan(hJumlahBobotDanBias(i)) Next
* Gunakan fungsi ini untuk menghitung nilai fungsi HyperTan (tanh)
Private Shared Function HyperTan(x As Double) As Double If x < -20.0 Then Return -1.0 ElseIf x > 20.0 Then Return 1.0 Else Return Math.Tanh(x) End If End Function
5e. Hitung matriks hoJumlahBobotDanBias dengan cara perkalian matriks antara matriks output sementara dan matriks hoBobot
For j = 0 To jumlahSarafOutput - 1 For i = 0 To jumlahSarafTersembunyi - 1 hoJumlahBobotDanBias(j) += hOutput(i) * hoBobot(i)(j) Next i Next j
5f. Kemudian masukkan nilai bias pada matriks hoJumlahBobotDanBias
For i = 0 To jumlahSarafOutput - 1 hoJumlahBobotDanBias(i) += oBias(i) Next i
5g. Hitung nilai output akhir dengan menggunakan fungsi Softmax untuk masing-masing data pada matriks hoJumlahBobotDanBias
Penjelasan tentang fungsi Softmax akan dijelaskan pada perhitungan dibawah ini (poin 5g1 – 5g3)
Dim hasil() As Double = Softmax(hoJumlahBobotDanBias) hasil.CopyTo(Me.outputs, 0) Return hasil
Memasuki perhitungan utama pada fungsi Softmax
5g1. Cari nilai maksimal data
Dim maksData As Double = hoJumlahBobotDanBias(0) For i = 0 To hoJumlahBobotDanBias.Length - 1 If hoJumlahBobotDanBias(i) > maksData Then maksData = hoJumlahBobotDanBias(i) End If Next i
5g2. Cari nilai skala
Dim skala As Double = 0.0 For i = 0 To hoJumlahBobotDanBias.Length - 1 skala += Math.Exp(hoJumlahBobotDanBias(i) - maksData) Next i
5g3. Hitung hasil akhir
Sehingga semua jumlah bobot pada parameter matriks hoJumlahBobotDanBias akan bernilai 1
Dim hasil(hoJumlahBobotDanBias.Length - 1) As Double For i = 0 To hoJumlahBobotDanBias.Length - 1 hasil(i) = Math.Exp(hoJumlahBobotDanBias(i) - maksData) / skala Next i
6. 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) < output(1) Then Console.Write("-> Ditolak ") If contohData(i)(jumlahKolom - 2) < contohData(i)(jumlahKolom - 1) Then jumlahBenar += 1 Console.WriteLine("Benar") ElseIf contohData(i)(jumlahKolom - 2) > contohData(i)(jumlahKolom - 1) Then jumlahSalah += 1 Console.WriteLine("Salah") End If Else Console.Write("-> Diterima ") If contohData(i)(jumlahKolom - 2) < contohData(i)(jumlahKolom - 1) Then jumlahSalah += 1 Console.WriteLine("Salah") ElseIf contohData(i)(jumlahKolom - 2) > contohData(i)(jumlahKolom - 1) Then jumlahBenar += 1 Console.WriteLine("Benar") End If End If
7. 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"))
8. Lakukan perhitungan yang sama (poin 5 dan 6) untuk masing-masing data baru
For i As Integer = 0 To dataBaru.Length - 1 Console.Write("Pelanggan " & Chr(i + 65 + 8) & " ") Dim input(jumlahKolom - 3) As Double Array.Copy(dataBaru(i), input, jumlahKolom - 2) For j = 0 To input.Length - 1 Console.Write(IIf(input(j) >= 0, " ", "") & input(j).ToString("F2") & " ") Next j Console.Write(" ") Dim output() As Double = jst.hitungNilaiOutput(input) For j = 0 To output.Length - 1 Console.Write(output(j).ToString("F2") & " ") Next j Console.Write(" ") If output(0) < output(1) 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.