Algoritma RBF (Radial Basis Function) / Radial Nets 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.
Algoritma ini memiliki kemiripan struktur data dengan Algoritma JST (Jaringan Saraf Tiruan), tetapi teknik perhitungan yang dilakukan sangat berbeda.
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 adalah sebagai berikut:
Dim data(9)() As String data(0) = New String() {44, "Laki-laki", 3.55, "Diterima"} data(1) = New String() {52, "Perempuan", 4.71, "Diterima"} data(2) = New String() {60, "Perempuan", 6.56, "Ditolak"} data(3) = New String() {56, "Laki-laki", 6.8, "Ditolak"} data(4) = New String() {51, "Laki-laki", 6.94, "Ditolak"} data(5) = New String() {46, "Perempuan", 6.52, "Ditolak"} data(6) = New String() {48, "Laki-laki", 4.25, "Diterima"} data(7) = New String() {58, "Perempuan", 5.71, "Diterima"}
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 | Umur | Jenis Kelamin | Skor Kepribadian |
---|---|---|---|
Pelanggan I | 47 | Perempuan | 6.05 |
Pelanggan J | 52 | Laki-Laki | 5 |
Contoh data baru yang akan dihitung adalah sebagai berikut:
Untuk kriteria Nilai Hasil:
Karena belum diketahui nilai hasilnya, maka semua inputan data adalah kosong
data(8) = New String() {47, "Perempuan", 6.05, ""} data(9) = New String() {52, "Laki-laki", 5, ""}
Langkah-langkah penggunaan algoritma ini adalah
1. Tentukan normalisasi matriks data ke dalam bentuk angka
Contoh dalam kasus ini:
- Kriteria umur dinormalisasi dengan cara mencari rata-rata dari semua data umur, kemudian mengurangkan masing-masing umur dengan rata-ratanya
- Kriteria jenis kelamin dinormalisasi dengan cara:
Jenis kelamin Laki-laki dilambangkan dengan angka -1
Jenis kelamin Perempuan dilambangkan dengan angka +1 - Kriteria jenis kepribadian dinormalisasi dengan cara mencari rata-rata dari semua data skor, kemudian mengurangkan masing-masing skor dengan rata-ratanya
- Kriteria Hasil memiliki 2 kolom untuk merepresentasikan kondisi Diterima dan Ditolak
Kriteria hasil dinormalisasi dengan cara:
Jika kondisi Diterima, maka inputan data kolom adalah 1, 0
Jika kondisi Ditolak, maka inputan data kolom adalah 0, 1
Untuk setiap data baru, karena belum ditemukan hasilnya, maka dilambangkan dengan -1, -1
Dim ratarataUmur As Double = 0, ratarataSkor As Double = 0 For i As Integer = 0 To data.Length - 1 ratarataUmur += data(i)(0) ratarataSkor += data(i)(2) Next ratarataUmur /= data.Length ratarataSkor /= data.Length Dim contohData(7)() As Double For i As Integer = 0 To 7 contohData(i) = New Double(4) {} contohData(i)(0) = data(i)(0) - ratarataUmur contohData(i)(1) = IIf(data(i)(1) = "Laki-laki", -1, IIf(data(i)(1) = "Perempuan", +1, 0)) contohData(i)(2) = data(i)(2) - ratarataSkor If data(i)(3) = "Diterima" Then contohData(i)(3) = 1 contohData(i)(4) = 0 ElseIf data(i)(3) = "Ditolak" Then contohData(i)(3) = 0 contohData(i)(4) = 1 End If Next i Dim dataBaru(1)() As Double For i As Integer = 0 To 1 dataBaru(i) = New Double(4) {} dataBaru(i)(0) = data(i + 8)(0) - ratarataUmur dataBaru(i)(1) = IIf(data(i + 8)(1) = "Laki-laki", -1, IIf(data(i + 8)(1) = "Perempuan", +1, 0)) dataBaru(i)(2) = data(i + 8)(2) - ratarataSkor dataBaru(i)(3) = -1 dataBaru(i)(4) = -1 Next i
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 rn As New RadialNets(jumlahTitikInput, jumlahTitikTersembunyi, jumlahTitikOutput)
* Diperlukan sebuah class untuk menyimpan semua matriks data untuk digunakan dalam perhitungan algoritma ini. Class ini dinamakan class RadialNets. Deklarasi awal untuk setiap pengisian data adalah sebagai berikut
Public Class RadialNets Private rnd As Random Private jumlahTitikInput As Integer Private jumlahTitikTersembunyi As Integer Private jumlahTitikOutput As Integer Private inputs As Double() Private centroids As Double()() Private widths As Double() Private hoBobot As Double()() 'Matriks data bobot untuk perhitungan bagian titik tersembunyi-output Private oBias As Double() 'Matriks bias untuk titik output Private outputs As Double() Public Sub New(jumlahTitikInput As Integer, jumlahTitikTersembunyi As Integer, jumlahTitikOutput As Integer) rnd = New Random(0) Me.jumlahTitikInput = jumlahTitikInput Me.jumlahTitikTersembunyi = jumlahTitikTersembunyi Me.jumlahTitikOutput = jumlahTitikOutput Me.inputs = New Double(jumlahTitikInput - 1) {} Me.centroids = New Double(jumlahTitikTersembunyi - 1)() {} For i As Integer = 0 To jumlahTitikTersembunyi - 1 Me.centroids(i) = New Double(jumlahTitikInput - 1) {} Next Me.widths = New Double(jumlahTitikTersembunyi - 1) {} Me.hoBobot = New Double(jumlahTitikTersembunyi - 1)() {} For i As Integer = 0 To jumlahTitikTersembunyi - 1 Me.hoBobot(i) = New Double(jumlahTitikOutput - 1) {} Next Me.oBias = New Double(jumlahTitikOutput - 1) {} Me.outputs = New Double(jumlahTitikOutput - 1) {} End Sub . . . End Class
3. Tentukan parameter-parameter yang digunakan dalam perhitungan
3a. Tentukan jumlah iterasi yang digunakan dalam perhitungan
Diasumsikan dalam kasus ini, jumlah iterasi yang dilakukan adalah sebanyak 100 kali
Const jumlahIterasi As Integer = 100
4. Lakukan proses perhitungan dengan menggunakan algoritma ini
Kemudian dapatkan nilai bobot dan nilai bias terbaik untuk digunakan dalam perhitungan data yang baru
Penjelasan tentang fungsi ini akan dijelaskan pada perhitungan dibawah ini
Dim bobotTerbaik As Double() = rn.RBF(contohData, jumlahIterasi) rn.setBobot(bobotTerbaik)
Memasuki perhitungan utama pada fungsi RBF
4a. Tentukan matriks centroid
Centroid adalah beberapa baris data yang diambil sebagai perwakilan data
Penjelasan mengenai fungsi ini dapat dilihat pada keterangan skrip dibawah ini (poin 4a1 – 4a2)
HitungCentroid(contohData)
Memasuki perhitungan utama pada fungsi HitungCentroid
4a1. Lakukan perhitungan pada masing-masing contoh data (poin 4a1a – 4a1e)
For i As Integer = 0 To contohData.Length - 1 . . .
4a1a. Cari indeks acak untuk digunakan sebagai nilai awal
Dim indeksAcak As Integer() = New Integer(jumlahTitikTersembunyi - 1) {} For j As Integer = 0 To jumlahTitikTersembunyi - 1 indeksAcak(j) = j Next For t As Integer = jumlahTitikTersembunyi To contohData.Length - 1 Dim m As Integer = rnd.[Next](0, t + 1) If m < jumlahTitikTersembunyi Then indeksAcak(m) = t End If Next
4a1b. Lakukan perhitungan pada masing-masing pasangan indeks acak yang telah ditentukan sebelumnya
For j As Integer = 0 To indeksAcak.Length - 2 Dim indeksPertama As Integer = indeksAcak(j) Dim indeksKedua As Integer = indeksAcak(j + 1) . . .
4a1c. Hitung rata-rata absolut jarak antara 2 data pada indeks pertama dan indeks kedua
Dim sum As Double = 0.0 For k As Integer = 0 To jumlahTitikInput - 1 Dim delta As Double = Math.Abs(contohData(indeksPertama)(k) - contohData(indeksKedua)(k)) sum += delta Next jumlahJarak += sum / jumlahTitikInput
4a1d. Perkiraan rata-rata jarak untuk semua data dengan indeks acak diatas
Dim perkiraanRatarataJarak As Double = jumlahJarak / jumlahTitikInput
4a1e. Indeks yang cukup baik adalah indeks data dengan jarak lebih dari jarak rata-rata terbesar
Ini berarti data data dengan indeks tersebut cukup berjauhan satu sama lain
If perkiraanRatarataJarak > JarakRatarataTerbesar Then JarakRatarataTerbesar = perkiraanRatarataJarak Array.Copy(indeksAcak, indeksCukupBaik, indeksAcak.Length) End If
4a2. Simpan data-data dengan indeks yang terpilih sebelumnya kedalam matriks centroid
For i As Integer = 0 To jumlahTitikTersembunyi - 1 Dim idx As Integer = indeksCukupBaik(i) For j As Integer = 0 To jumlahTitikInput - 1 Me.centroids(i)(j) = contohData(idx)(j) Next Next
4b. Tentukan matriks width
Untuk setiap baris data pada centroid, tentukan jumlah jarak antar centroid yang bersebelahan
Penjelasan mengenai fungsi ini dapat dilihat pada keterangan skrip dibawah ini (poin 4b1 – 4b2)
HitungWidth(Me.centroids)
Memasuki perhitungan utama pada fungsi HitungWidth
4b1. Lakukan perhitungan pada masing-masing pasangan centroid
For i As Integer = 0 To centroids.Length - 2 For j As Integer = i + 1 To centroids.Length - 1 . . .
4b1a. Hitung jarak antara centroid tersebut menggunakan metode Euclidean
Kemudian jumlahkan semua nilai jarak yang ditemukan
Penjelasan mengenai fungsi tersebut dapat dilihat pada keterangan skrip dibawah ini
Dim jarak As Double = jarakEuclidean(centroids(i), centroids(j), centroids(i).Length) jumlahJarak += jarak
* Gunakan fungsi ini untuk menghitung jarak Euclidean antara 2 data
Private Shared Function jarakEuclidean(dataPertama As Double(), dataKedua As Double(), jumlahData As Integer) As Double If dataPertama.Length <> dataKedua.Length Then Throw New Exception("pada fungsi jarakEuclidean, ukuran matriks data pertama tidak sama dengan ukuran matriks data kedua") End If Dim jumlah As Double = 0.0 For i As Integer = 0 To jumlahData - 1 Dim delta As Double = (dataPertama(i) - dataKedua(i)) * (dataPertama(i) - dataKedua(i)) jumlah += delta Next Return Math.Sqrt(jumlah) End Function
4b2. Hitung nilai width, yaitu rata-rata jarak yang ada pada masing-masing centroid
Dim ratarataJarak As Double = jumlahJarak / ct Dim width As Double = ratarataJarak
4c. Tentukan nilai bobot dan nilai bias dari setiap data awal
Penjelasan mengenai fungsi ini dapat dilihat pada keterangan skrip dibawah ini (poin 4c1 – 4c4)
Dim bobotTerbaik As Double() = HitungBobot(contohData, jumlahIterasi)
Memasuki perhitungan utama pada fungsi HitungBobot
* Inisialisasi semua posisi partikel awal dengan posisi acak
4c1. Lakukan perhitungan pada masing-masing partikel
For i = 0 To swarm.Length - 1 . . .
4c1a. Tentukan posisi acak pada partikel tersebut sesuai dengan batasan minimal dan maksimal nilai
Dim posisiAcak(dimensi - 1) As Double For j = 0 To posisiAcak.Length - 1 Dim lo As Double = minNilai Dim hi As Double = maksNilai posisiAcak(j) = (hi - lo) * rnd.NextDouble + lo Next j
4c1b. Hitung nilai kesalahannya dengan menggunakan teknik MSE (Mean Squared Error)
Penjelasan tentang fungsi MSE akan dijelaskan pada perhitungan dibawah ini
Dim nilaiKesalahan As Double = MeanSquaredError(contohData, posisiAcak)
* 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 nilaiInput As Double() = New Double(jumlahTitikInput - 1) {} Dim nilaiOutput As Double() = New Double(jumlahTitikOutput - 1) {} Dim hasil As Double = 0.0 For i As Integer = 0 To contohData.Length - 1 Array.Copy(contohData(i), nilaiInput, jumlahTitikInput) Array.Copy(contohData(i), jumlahTitikInput, nilaiOutput, 0, jumlahTitikOutput) Dim dataKolomHasil As Double() = Me.HitungNilaiOutput(nilaiInput) For j As Integer = 0 To dataKolomHasil.Length - 1 hasil += ((dataKolomHasil(j) - nilaiOutput(j)) * (dataKolomHasil(j) - nilaiOutput(j))) Next Next Return hasil / contohData.Length End Function
4c1c. Hitung kecepatan acak partikel tersebut sesuai dengan batasan kecepatan minimal dan maksimal
Dim kecepatanAcak(dimensi - 1) As Double For j = 0 To kecepatanAcak.Length - 1 Dim lo As Double = -1.0 * Math.Abs(maksNilai - minNilai) Dim hi As Double = Math.Abs(maksNilai - minNilai) kecepatanAcak(j) = (hi - lo) * rnd.NextDouble + lo Next j
4c1d. Ambil posisi partikel terbaik sementara berdasarkan nilai kesalahan terendah sementara
If swarm(i).nilaiKesalahan < nilaiKesalahanTerendah Then nilaiKesalahanTerendah = swarm(i).nilaiKesalahan swarm(i).posisi.CopyTo(posisiTerbaik, 0) End If
4c2. Tentukan bobot inertia (w), bobot kognitif (c1), dan bobot sosial (c2)
Nilai acuan untuk masing-masing variabel dapat dilihat di http://ieeexplore.ieee.org/stamp/stamp.jsp?arnumber=00870279
Diasumsikan dalam kasus ini, nilai bobot tersebut akan mengikuti nilai acuan yang sudah ada
Const w As Double = 0.729 Const c1 As Double = 1.49445 Const c2 As Double = 1.49445
4c3. Lakukan perhitungan sebanyak parameter jumlah iterasi
Dim iterasi As Integer = 0 Do While iterasi < jumlahIterasi iterasi += 1 . . .
4c3a. Jika nilai kesalahan sudah cukup rendah, maka perhitungan akan dihentikan
If nilaiKesalahanTerendah < 0.06 Then Exit While
4c3b. Lakukan pengacakan urutan partikel yang akan dihitung terlebih dahulu
For i As Integer = 0 To urutanPartikel.Length - 1 Dim r As Integer = rnd.[Next](i, urutanPartikel.Length) Dim tmp As Integer = urutanPartikel(r) urutanPartikel(r) = urutanPartikel(i) urutanPartikel(i) = tmp Next
4c3c. Lakukan perulangan untuk setiap partikel
Partikel yang dihitung adalah sesuai dengan urutan acak yang telah ditentukan sebelumnya (poin 4c3c1 – 4c3c5)
For pi As Integer = 0 To swarm.Length - 1 Dim i As Integer = urutanPartikel(pi) Dim partikelTerpilih As Partikel = swarm(i) . . .
* Lakukan perhitungan untuk menentukan nilai kecepatan yang baru (poin 4c3c1)
4c3c1. Lakukan perhitungan pada setiap nilai kecepatan dalam masing-masing dimensi
For j = 0 To partikelTerpilih.kecepatan.Length - 1 . . .
4c3c1a. Cari kecepatan perpindahan posisi yang baru dengan rumus:
v baru = (w * v skrg) + (c1 * r1 * (posisi terbaik – posisi skrg)) + (c2 * r2 * (posisi umum terbaik – posisi skrg))
kecepatanBaru(j) = (w * partikelTerpilih.kecepatan(j)) + (c1 * r1 * (partikelTerpilih.posisiTerbaik(j) - partikelTerpilih.posisi(j))) + (c2 * r2 * (posisiTerbaik(j) - partikelTerpilih.posisi(j)))
4c3c1b. Jika kecepatan tersebut ternyata diluar batas kecepatan yang diperbolehkan,
maka kembalikan nilainya agar masuk dalam batas tersebut
If kecepatanBaru(j) < minKecepatan Then kecepatanBaru(j) = minKecepatan ElseIf kecepatanBaru(j) > maksKecepatan Then kecepatanBaru(j) = maksKecepatan End If
* Lakukan perhitungan untuk menentukan posisi yang baru (poin 4c1b)
4c3c2. Lakukan perhitungan pada setiap nilai posisi dalam masing-masing dimensi
For j = 0 To partikelTerpilih.posisi.Length - 1 . . .
4c3c2a. Hitung posisi baru dengan menambahkan posisi lama dengan kecepatan yang baru
posisiBaru(j) = partikelTerpilih.posisi(j) + kecepatanBaru(j)
4c3c2b. Jika posisi tersebut ternyata diluar batas posisi yang diperbolehkan,
maka kembalikan nilainya agar masuk dalam batas tersebut
If posisiBaru(j) < minNilai Then posisiBaru(j) = minNilai ElseIf posisiBaru(j) > maksNilai Then posisiBaru(j) = maksNilai End If
4c3c3. Hitung nilai fitness untuk posisi yang baru
posisiBaru.CopyTo(partikelTerpilih.posisi, 0) nilaiKesalahanBaru = MeanSquaredError(contohData, posisiBaru) partikelTerpilih.nilaiKesalahan = nilaiKesalahanBaru
4c3c4. Jika nilai fitness baru lebih baik dari nilai fitness sebelumnya, maka ambil posisi yang baru sebagai posisi terbaik partikel tersebut
If nilaiKesalahanBaru < partikelTerpilih.nilaiKesalahanTerendah Then posisiBaru.CopyTo(partikelTerpilih.posisiTerbaik, 0) partikelTerpilih.nilaiKesalahanTerendah = nilaiKesalahanBaru End If
4c3c5. Jika nilai fitness baru ternyata lebih baik dari nilai fitness umum, maka ambil posisi yang baru sebagai posisi terbaik secara umum
If nilaiKesalahanBaru < nilaiKesalahanTerendah Then posisiBaru.CopyTo(posisiTerbaik, 0) nilaiKesalahanTerendah = nilaiKesalahanBaru End If
4c4. Masukkan data posisi terbaik sebagai nilai bobot dan nilai bias
Me.setBobot(posisiTerbaik) Dim nilaiAkhir As Double() = New Double((jumlahTitikTersembunyi * jumlahTitikOutput) + (jumlahTitikOutput - 1)) {} Array.Copy(posisiTerbaik, nilaiAkhir, posisiTerbaik.Length)
* Gunakan fungsi ini untuk memasukkan matriks bobot kedalam 2 matriks data yaitu matriks hoBobot dan oBias
hoBobot adalah matriks bobot pada titik tersembunyi-output, dengan jumlah data = jumlah titik tersembunyi * jumlah titik output
oBias adalah matriks nilai bias pada titik output, dengan jumlah data = jumlah titik output
Public Sub setBobot(bobot As Double()) If bobot.Length <> (jumlahTitikTersembunyi * jumlahTitikOutput) + jumlahTitikOutput Then Throw New Exception("Pada fungsi setBobot, ukuran matriks bobot tidak sejumlah jumlahTitikTersembunyi * jumlahTitikOutput) + jumlahTitikOutput") End If Dim iBobot As Integer = 0 For i As Integer = 0 To jumlahTitikTersembunyi - 1 For j As Integer = 0 To jumlahTitikOutput - 1 Me.hoBobot(i)(j) = bobot(iBobot) iBobot += 1 Next Next For i As Integer = 0 To jumlahTitikOutput - 1 Me.oBias(i) = bobot(iBobot) iBobot += 1 Next End Sub
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 – 5d)
Dim output() As Double = rn.hitungNilaiOutput(input)
Memasuki perhitungan utama pada fungsi hitungNilaiOutput
5a. Lakukan perulangan pada masing-masing jumlah titik tersembunyi
For j As Integer = 0 To jumlahTitikTersembunyi - 1 . . .
5a1. Hitung jarak menggunakan metode Euclidean
Penjelasan mengenai fungsi ini sudah dijelaskan pada perhitungan sebelumnya
Dim d As Double = jarakEuclidean(inputs, centroids(j), inputs.Length)
5a2. Hitung nilai output dengan rumus:
g = exp(-d^2 / (2 * width^2))
Dim r As Double = -1.0 * (d * d) / (2 * widths(j) * widths(j)) Dim g As Double = Math.Exp(r) hOutputs(j) = g
5b. Hitung nilai sementara dengan cara perkalian antara nilai output pada titik tersembunyi dikali dengan matriks bobot pada titik tersembunyi-output
For k As Integer = 0 To jumlahTitikOutput - 1 For j As Integer = 0 To jumlahTitikTersembunyi - 1 nilaiOutputSementara(k) += (hOutputs(j) * hoBobot(j)(k)) Next Next
5c. Tambahkan nilai bias pada nilai sementara
For k As Integer = 0 To jumlahTitikOutput - 1 nilaiOutputSementara(k) += oBias(k) Next
5d. Hitung nilai output akhir dengan menggunakan fungsi Softmax untuk masing-masing data nilai output sementara
Penjelasan tentang fungsi Softmax akan dijelaskan pada perhitungan dibawah ini (poin 5d1 – 5d3)
Dim nilaiOutputAkhir() As Double = Softmax(nilaiOutputSementara) Array.Copy(nilaiOutputAkhir, Me.outputs, nilaiOutputAkhir.Length)
Memasuki perhitungan utama pada fungsi Softmax
5d1. 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
5d2. Cari nilai skala
Dim skala As Double = 0.0 For i = 0 To hoJumlahBobotDanBias.Length - 1 skala += Math.Exp(hoJumlahBobotDanBias(i) - maksData) Next i
5d3. 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 = rn.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
* Agar dapat menjalankan skrip diatas, maka diperlukan sebuah Class Partikel untuk menampung semua data titik yaitu posisi, kecepatan, dan nilai kesalahan partikel tersebut. Deklarasi Class Partikel adalah sebagai berikut:
Public Class Partikel Public posisi As Double() Public nilaiKesalahan As Double Public kecepatan As Double() Public posisiTerbaik As Double() Public nilaiKesalahanTerendah As Double Public Sub New(posisi As Double(), nilaiKesalahan As Double, kecepatan As Double(), posisiTerbaik As Double(), nilaiKesalahanTerendah As Double) Me.posisi = New Double(posisi.Length - 1) {} posisi.CopyTo(Me.posisi, 0) Me.nilaiKesalahan = nilaiKesalahan Me.kecepatan = New Double(kecepatan.Length - 1) {} kecepatan.CopyTo(Me.kecepatan, 0) Me.posisiTerbaik = New Double(posisiTerbaik.Length - 1) {} posisiTerbaik.CopyTo(Me.posisiTerbaik, 0) Me.nilaiKesalahanTerendah = nilaiKesalahanTerendah End Sub End Class
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.
Mas… saya ingin tahu mengenai algoritma radial basis function untuk peramalan data time series. Terima kasih.
Tentu saja algoritma ini dapat digunakan untuk melakukan prediksi data time series. Yang perlu anda lakukan hanyalah mengganti data contoh pada pos ini menyesuaikan dengan data yang anda miliki. Semua alurnya tetap sama,
Karena anda belum menjelaskan data yang anda miliki, maka saya belum bisa mengetahui cara “penyesuaian” secara spesifik dari kasus anda. Silahkan anda informasikan terlebih dahulu
Data yang saya miliki data tingkat inflasi Indonesia bulan jan 2003 sampai dengan september 2016. Yang akan saya ramalkan bulan Oktober, November dan Desember 2016. Analisa saya yang pertama menentukan input sesuai lag ACF data ada 9 input. Berarti pola data yang pertama masukan bulan jan 2003 sampai dengan bulan sept 2003 dan targetnya bulan okt 2003 begitu seterusnya. Baru data saya komposisi training 80 % dan 20% testing. Setelah itu kan penentuan titik pusat dan varian dg k-means. Nah disitu dan seterusnya saya bingung langkahnya. Mohon dijelaskan. Terima kasih.
Perlu diingat bahwa algoritma ini tidak menerapkan Algoritma K-Means Clustering. Cara implementasi algoritma K-Means Clustering dapat anda lihat pada halaman tersebut, dan menurut saya tidak ada kecocokan implementasi antara algoritma tersebut dengan algoritma ini.
Sistem yang anda rancang sudah benar. Fungsi pencarian titik pusat sudah tercatat dalam fungsi HitungCentroid pada poin 4a1 – 4a2. Fungsi pencarian varian sudah tercatat dalam fungsi HitungWidth pada poin 4b1 – 4b2. Selanjutnya adalah perhitungan bobot yang sudah tercatat dalam poin 4c. Jumlah bobot yang dicari adalah tergantung dari jumlah data dan struktur jaringan saraf yang anda gunakan. Lakukan pelatihan pada semua data input yang anda pakai, kemudian dapatkan nilai bobot yang paling optimal, dalam kasus ini, saya gunakan nilai MSE terendah untuk mencari bobot yang paling optimal. Proses perhitungan utama selesai sampai disini.
Selanjutnya adalah tahap optional, yaitu menghitung nilai output dari masing-masing data testing dan bandingkan dengan nilai sebenarnya. Kemudian hitung jumlah prediksi benar dan prediksi salah untuk mengetahui tingkat kecocokan dari proses pelatihan bobot tersebut.
Langkah terakhir adalah melakukan perhitungan nilai output pada data yang tidak memiliki nilai output. Dalam kasus anda berarti data yang diperlukan untuk menghitung prediksi pada bulan Okt-Des 2016
Apakah data harus di normalisasi dulu atau boleh tidak? Kemudian untuk menentukan hidden unit apa harus dg metode k-means/SOM? Mohon penjelasannya. Terima kasih.
Data sebaiknya dinormalisasi dulu apabila antar data tidak memiliki rentang nilai yang setingkat,
contoh: terdapat masing-masing data yang memiliki 2 kriteria. Kriteria pertama berada pada rentang 1-10. Kriteria kedua berada pada 50-100. Sebelum masuk dalam algoritma ini, sebaiknya data dinormalisasi pada rentang yang sama agar tidak ada kriteria yang lebih mendominasi nilai output. Rentang yang baru dapat anda tentukan sendiri, tidak harus mengikuti rentang yang sudah ada, tetapi bisa menggunakan rentang lain, misalnya 0 – 1 atau -1 – 1.
Jika menggunakan algoritma ini secara murni, maka semua perhitungan dapat dilakukan tanpa menggunakan algoritma lain seperti Algoritma K-Means Clustering atau Algoritma SOM (Self Organizing Maps), kecuali jika permintaan kasus anda memang mengharuskan 2 atau lebih jumlah algoritma yang dipakai. Jika demikian maka saya harus meneliti kembali per kasus, karena setiap kasus pasti memiliki kebutuhan yang berbeda, sehingga cara penyesuaian penggabungan algoritma yang dilakukan juga akan berbeda.
Oke terima kasih atas penjelasannya. Mas punya source code matlab.nya tidak? Saya pakainya matlab soalnya. Terima kasih.
Saya tidak memiliki contoh implementasi dalam bahasa pemrograman matlab, tetapi saya bisa bantu untuk melakukan konversi skrip atau mencari dan memodifikasi referensi skrip matlab yang sudah tersedia.
Oke saya akan mencoba sendiri dulu. Punya literatur manualnya tentang rbf tidak mas? Yanh berisi rumus2 untuk perhitungannya. Terima kasih.
Saya tidak memiliki referensi jurnal mengenai algoritma ini. Cara implementasi yang saya bagikan pada pos ini adalah hasil pembelajaran dari beberapa referensi website dan skrip yang saya temukan sebelumnya. Mengenai referensi jurnal silahkan anda cari langsung melalui google.
terimakasih atas tulisan nya yg cukup mencerahkan
mas, dicontoh ditulis ada 8 training data yang dijadikan acuan dalam melakukan perkiraan
bagaimana jika training data dalam bentuk file dan terdiri dari banyak data?
terimakasih sebelumnya
Jika data yang anda miliki tersedia dalam bentuk file maka tentunya anda harus melakukan pembacaan file dan mengambil data-data yang diperlukan dalam file tersebut. Saya rasa ini adalah langkah tambahan saja sebelum memasuki point pertama dalam penjelasan diatas.