Algoritma RBF (Radial Basis Function) / Radial Nets 12


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:

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 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:

PelangganUmurJenis KelaminSkor Kepribadian
Pelanggan I47Perempuan6.05
Pelanggan J52Laki-Laki5

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)

cmd36a

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 *

12 pemikiran di “Algoritma RBF (Radial Basis Function) / Radial Nets

    • pip Penulis

      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

      • Al Hikmah

        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.

        • pip Penulis

          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

      • Al Hikmah

        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.

        • pip Penulis

          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.

        • Al Hikmah

          Oke terima kasih atas penjelasannya. Mas punya source code matlab.nya tidak? Saya pakainya matlab soalnya. Terima kasih.

        • pip Penulis

          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.

        • Al Hikmah

          Oke saya akan mencoba sendiri dulu. Punya literatur manualnya tentang rbf tidak mas? Yanh berisi rumus2 untuk perhitungannya. Terima kasih.

        • pip Penulis

          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.

  • Mahag

    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

    • pip Penulis

      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.