Algoritma DNN (Deep Neural Networks)


Algoritma DNN (Deep Neural Networks) 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.
Inti perhitungan pada algoritma berbasis jaringan adalah untuk mencari bobot terbaik dari contoh / sampel data yang sudah ada. Karena hasil pada contoh data sudah diketahui, maka nilai bobot akan dihitung berdasarkan nilai hasil yang sudah tersedia, sampai ditemukan nilai bobot terbaik yang paling banyak cocok apabila dihitungkan kembali pada data awal. Kemudian nilai bobot tersebut dapat digunakan untuk menghitung data lain yang tidak diketahui hasilnya. Pada kasus ini, metode yang digunakan untuk mencari bobot terbaik adalah menggunakan metode PSO (Particle Swarm Optimization)
Algoritma ini merupakan pengembangan dari Algoritma JST (Jaringan Saraf Tiruan). Pengertian Deep Neural Networks yang paling umum adalah jaringan saraf tiruan yang memiliki lebih dari 1 lapisan saraf tersembunyi. Menurut teori jurnal penelitian, algoritma ini dapat menyelesaikan beberapa kasus yang tidak bisa diselesaikan dengan algoritma JST. Sebagai alternatif, algoritma ini dapat menggantikan algoritma JST yang menggunakan banyak sekali saraf pada lapisan tersembunyi.



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

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 – 5 – 2, dimana:

  • 3 adalah jumlah saraf input, karena ada 3 kriteria awal, yaitu Umur, Jenis Kelamin, dan Skor Kepribadian
  • 4 adalah jumlah saraf tersembunyi pada lapisan pertama. Jumlah saraf tersembunyi ini harus lebih dari jumlah saraf input

dalam kasus ini bisa lebih dari 4, tetapi hanya digunakan 4 saja untuk mempercepat perhitungan

  • 5 adalah jumlah saraf tersembunyi pada lapisan kedua. Jumlah saraf tersembunyi ini harus berbeda dari jumlah saraf tersembunyi pada lapisan pertama

dalam kasus ini harus selain angka 4, sehingga digunakan angka 5

  • 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 jumlahSarafTersembunyi1 As Integer = 4
Const jumlahSarafTersembunyi2 As Integer = 5
Const jumlahSarafOutput As Integer = 2
Dim jst As New JaringanSaraf(jumlahSarafInput, jumlahSarafTersembunyi1, jumlahSarafTersembunyi2, 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 jumlahSarafTersembunyi1 As Integer
    Private jumlahSarafTersembunyi2 As Integer
    Private jumlahSarafOutput As Integer

    Private inputs As Double()

    'Matriks data untuk perhitungan jaringan saraf input-tersembunyi1
    Private boboti1 As Double()()
    Private bias1 As Double()
    Private output1 As Double()

    'Matriks data untuk perhitungan jaringan saraf tersembunyi1-tersembunyi2
    Private bobot12 As Double()()
    Private bias2 As Double()
    Private output2 As Double()

    'Matriks data untuk perhitungan jaringan saraf tersembunyi2-output
    Private bobot2o As Double()()
    Private biaso As Double()

    Private outputs As Double()

    Public Sub New(jumlahSarafInput As Integer, jumlahSarafTersembunyi1 As Integer, jumlahSarafTersembunyi2 As Integer, jumlahSarafOutput As Integer)
        rnd = New Random(0)

        Me.jumlahSarafInput = jumlahSarafInput
        Me.jumlahSarafTersembunyi1 = jumlahSarafTersembunyi1
        Me.jumlahSarafTersembunyi2 = jumlahSarafTersembunyi2
        Me.jumlahSarafOutput = jumlahSarafOutput

        inputs = New Double(jumlahSarafInput - 1) {}

        'boboti1 = MakeMatrix(jumlahSarafInput, jumlahSarafTersembunyi1)
        Dim boboti1(jumlahSarafInput - 1)() As Double
        For i = 0 To jumlahSarafInput - 1
            boboti1(i) = New Double(jumlahSarafTersembunyi1 - 1) {}
        Next i
        Me.boboti1 = boboti1
        bias1 = New Double(jumlahSarafTersembunyi1 - 1) {}
        output1 = New Double(jumlahSarafTersembunyi1 - 1) {}

        'bobot12 = MakeMatrix(jumlahSarafTersembunyi1, jumlahSarafTersembunyi2)
        Dim bobot12(jumlahSarafTersembunyi1 - 1)() As Double
        For i = 0 To jumlahSarafTersembunyi1 - 1
            bobot12(i) = New Double(jumlahSarafTersembunyi2 - 1) {}
        Next i
        Me.bobot12 = bobot12
        bias2 = New Double(jumlahSarafTersembunyi2 - 1) {}
        output2 = New Double(jumlahSarafTersembunyi2 - 1) {}

        'bobot2o = MakeMatrix(jumlahSarafTersembunyi2, jumlahSarafOutput)
        Dim bobot2o(jumlahSarafTersembunyi2 - 1)() As Double
        For i = 0 To jumlahSarafTersembunyi2 - 1
            bobot2o(i) = New Double(jumlahSarafOutput - 1) {}
        Next i
        Me.bobot2o = bobot2o
        biaso = New Double(jumlahSarafOutput - 1) {}

        outputs = 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-tersembunyi1 adalah jumlah saraf input * jumlah saraf tersembunyi1 (3 * 4 = 12 buah)
  • jumlah nilai bias pada jaringan saraf input-tersembunyi1 adalah jumlah saraf tersembunyi1 (4 buah)
  • jumlah nilai bobot pada jaringan saraf tersembunyi1-tersembunyi2 adalah jumlah saraf tersembunyi1 * jumlah saraf tersembunyi2 (4 * 5 = 20 buah)
  • jumlah nilai bias pada jaringan saraf tersembunyi1-tersembunyi2 adalah jumlah saraf tersembunyi2 (5 buah)
  • jumlah nilai bobot pada jaringan saraf tersembunyi2-output adalah jumlah saraf tersembunyi2 * jumlah saraf output (5 * 2 = 10 buah)
  • jumlah nilai bias pada jaringan saraf tersembunyi2-output adalah jumlah saraf output (2 buah)

Sehingga, banyak data yang diperlukan adalah 12 + 4 + + 20 + 5 + 10 + 2 = 53 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 * jumlahSarafTersembunyi1) + jumlahSarafTersembunyi1 + (jumlahSarafTersembunyi1 * jumlahSarafTersembunyi2) + jumlahSarafTersembunyi2 + (jumlahSarafTersembunyi2 * jumlahSarafOutput) + 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 kedalam 6 matriks data yaitu matriks boboti1, bias1, bobot12, bias2, bobot2o, biaso
boboti1 adalah matriks bobot pada jaringan saraf input-tersembunyi1, dengan jumlah data = jumlah saraf input * jumlah saraf tersembunyi1
bias1 adalah matriks nilai bias pada jaringan saraf input-tersembunyi1, dengan jumlah data = jumlah saraf tersembunyi1
bobot12 adalah matriks bobot pada jaringan saraf tersembunyi1-tersembunyi2, dengan jumlah data = jumlah saraf tersembunyi1 * jumlah saraf tersembunyi2
bias2 adalah matriks nilai bias pada jaringan saraf tersembunyi1-tersembunyi2, dengan jumlah data = jumlah saraf tersembunyi2
bobot2o adalah matriks bobot pada jaringan saraf tersembunyi2-output, dengan jumlah data = jumlah saraf tersembunyi2 * jumlah saraf output
biaso adalah matriks nilai bias pada jaringan saraf tersembunyi2-output, dengan jumlah data = jumlah saraf output

Public Sub setBobot(bobot As Double())
	Dim jumlahBobot As Integer = (jumlahSarafInput * jumlahSarafTersembunyi1) + jumlahSarafTersembunyi1 + (jumlahSarafTersembunyi1 * jumlahSarafTersembunyi2) + jumlahSarafTersembunyi2 + (jumlahSarafTersembunyi2 * jumlahSarafOutput) + 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 jumlahSarafTersembunyi1 - 1
			boboti1(i)(j) = bobot(k)
			k += 1
		Next
	Next

	For i As Integer = 0 To jumlahSarafTersembunyi1 - 1
		bias1(i) = bobot(k)
		k += 1
	Next

	For i As Integer = 0 To jumlahSarafTersembunyi1 - 1
		For j As Integer = 0 To jumlahSarafTersembunyi2 - 1
			bobot12(i)(j) = bobot(k)
			k += 1
		Next
	Next

	For i As Integer = 0 To jumlahSarafTersembunyi2 - 1
		bias2(i) = bobot(k)
		k += 1
	Next

	For i As Integer = 0 To jumlahSarafTersembunyi2 - 1
		For j As Integer = 0 To jumlahSarafOutput - 1
			bobot2o(i)(j) = bobot(k)
			k += 1
		Next
	Next

	For i As Integer = 0 To jumlahSarafOutput - 1
		biaso(i) = bobot(k)
		k += 1
	Next
End Sub

3. Tentukan parameter-parameter yang digunakan dalam perhitungan

3a. Tentukan Jumlah partikel yang digunakan
Diasumsikan dalam kasus ini jumlah partikel adalah 10 partikel

Const jumlahPartikel As Integer = 10

3b. Tentukan Jumlah maksimal iterasi
Diasumsikan dalam kasus ini jumlah maksimal iterasi adalah 500 kali

Const jumlahIterasi As Integer = 500

4. Lakukan proses pencarian nilai bobot dan bias terbaik
Metode yang digunakan adalah PSO (Particle Swarm Optimization)
Penjelasan tentang fungsi PSO akan dijelaskan pada perhitungan dibawah ini

Dim bobotTerbaik() As Double = jst.PSO(contohData, jumlahPartikel, jumlahIterasi)
jst.SetBobot(bobotTerbaik)

Memasuki perhitungan utama pada fungsi PSO

* Inisialisasi semua posisi partikel awal dengan posisi acak

4a. Lakukan perhitungan pada masing-masing partikel

For i = 0 To swarm.Length - 1
. . .

4a1. 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

4a2. Hitung nilai fitnessnya dengan menggunakan fungsi CrossEntropy
Penjelasan tentang fungsi CrossEntropy dapat dilihat pada penjelasan dibawah ini

Dim fitness As Double = CrossEntropy(contohData, posisiAcak)

* Gunakan fungsi ini untuk menghitung tingkat kesalahan dari masing-masing data input
Teknik yang digunakan adalah CrossEntropy
Pertama, hitung nilai output untuk masing-masing data
Nilai akhir didapat dari -1 * (jumlah dari (nilai kolom output * logaritma dari nilai output yang telah dihitung sebelumnya) untuk masing-masing data)

Private Function CrossEntropy(ByVal contohData()() As Double, ByVal bobot() As Double) As Double
	Me.SetBobot(bobot)

	Dim jumlahCrossEntropy As Double = 0.0

	For i = 0 To contohData.Length - 1
		Dim inputTerpilih(2) As Double
		Dim perkiraanOutput(1) As Double
		Array.Copy(contohData(i), inputTerpilih, 3)
		Array.Copy(contohData(i), 3, perkiraanOutput, 0, 2)

		Dim outputTerpilih() As Double = Me.hitungNilaiOutput(inputTerpilih)

		Dim jumlah As Double = 0.0
		For j = 0 To outputTerpilih.Length - 1
			If perkiraanOutput(j) <> 0.0 Then
				jumlah += perkiraanOutput(j) * Math.Log(outputTerpilih(j))
			End If
		Next j
		jumlahCrossEntropy += jumlah
	Next i
	Return -jumlahCrossEntropy
End Function

4a3. 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

4a4. Ambil posisi partikel terbaik sementara berdasarkan nilai fitness terendah sementara

If swarm(i).fitness < fitnessTerbaik Then
	fitnessTerbaik = swarm(i).fitness
	swarm(i).posisi.CopyTo(posisiTerbaik, 0)
End If

4b. 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

4c. Lakukan perhitungan sebanyak parameter jumlah iterasi

Dim iterasi As Integer = 0
Do While iterasi < jumlahIterasi
	iterasi += 1
	. . .

4c1. Lakukan perulangan untuk setiap partikel

For i = 0 To swarm.Length - 1
	Dim partikelTerpilih As Partikel = swarm(i)
	. . .

*Lakukan perhitungan untuk menentukan nilai kecepatan yang baru (poin 4c1a)

4c1a. Lakukan perhitungan pada setiap nilai kecepatan dalam masing-masing dimensi

For j = 0 To partikelTerpilih.kecepatan.Length - 1
. . .

4c1a1. 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)))

4c1a2. 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)

4c1b. Lakukan perhitungan pada setiap nilai posisi dalam masing-masing dimensi

For j = 0 To partikelTerpilih.posisi.Length - 1
. . .

4c1b1. Hitung posisi baru dengan menambahkan posisi lama dengan kecepatan yang baru

posisiBaru(j) = partikelTerpilih.posisi(j) + kecepatanBaru(j)

4c1b2. 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

4c1c. Hitung nilai fitness untuk posisi yang baru

posisiBaru.CopyTo(partikelTerpilih.posisi, 0)
fitnessBaru = CrossEntropy(matriksInput, posisiBaru)
partikelTerpilih.fitness = fitnessBaru

4c1d. Jika nilai fitness baru lebih baik dari nilai fitness sebelumnya, maka ambil posisi yang baru sebagai posisi terbaik partikel tersebut

If fitnessBaru < partikelTerpilih.fitnessTerbaik Then
	posisiBaru.CopyTo(partikelTerpilih.posisiTerbaik, 0)
	partikelTerpilih.fitnessTerbaik = fitnessBaru
End If

4c1e. Jika nilai fitness baru ternyata lebih baik dari nilai fitness umum, maka ambil posisi yang baru sebagai posisi terbaik secara umum

If fitnessBaru < fitnessTerbaik Then
	posisiBaru.CopyTo(posisiTerbaik, 0)
	fitnessTerbaik = fitnessBaru
End If

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 – 5j)

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 JumlahBobotDanBias1 dengan cara penjumlahan dari perkalian antara matriks input dan matriks boboti1

For j As Integer = 0 To jumlahSarafTersembunyi1 - 1
	For i As Integer = 0 To jumlahSarafInput - 1
		JumlahBobotDanBias1(j) += Me.inputs(i) * Me.boboti1(i)(j)
	Next
Next

5c. Kemudian tambahkan nilai bias1 pada matriks JumlahBobotDanBias1

For i As Integer = 0 To jumlahSarafTersembunyi1 - 1
	JumlahBobotDanBias1(i) += Me.bias1(i)
Next

5d. Hitung nilai output sementara dengan menggunakan fungsi HyperTan untuk masing-masing data pada matriks JumlahBobotDanBias1
Penjelasan tentang fungsi HyperTan akan dijelaskan pada perhitungan dibawah ini

For i As Integer = 0 To jumlahSarafTersembunyi1 - 1
	Me.output1(i) = HyperTan(JumlahBobotDanBias1(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 JumlahBobotDanBias2 dengan cara penjumlahan dari perkalian antara matriks output1 dan matriks bobot12

For j As Integer = 0 To jumlahSarafTersembunyi2 - 1
	For i As Integer = 0 To jumlahSarafTersembunyi1 - 1
		JumlahBobotDanBias2(j) += output1(i) * Me.bobot12(i)(j)
	Next
Next

5f. Kemudian tambahkan nilai bias2 pada matriks JumlahBobotDanBias2

For i As Integer = 0 To jumlahSarafTersembunyi2 - 1
	JumlahBobotDanBias2(i) += Me.bias2(i)
Next

5g. Hitung nilai output sementara dengan menggunakan fungsi HyperTan untuk masing-masing data pada matriks JumlahBobotDanBias2
Penjelasan tentang fungsi HyperTan sudah dijelaskan pada perhitungan sebelumnya

For i As Integer = 0 To jumlahSarafTersembunyi2 - 1
	Me.output2(i) = HyperTan(JumlahBobotDanBias2(i))
Next

5h. Hitung matriks JumlahBobotDanBiaso dengan cara penjumlahan dari perkalian antara matriks output2 dan matriks bobot2o

For j As Integer = 0 To jumlahSarafOutput - 1
	For i As Integer = 0 To jumlahSarafTersembunyi2 - 1
		JumlahBobotDanBiaso(j) += output2(i) * bobot2o(i)(j)
	Next
Next

5i. Kemudian tambahkan nilai biaso pada matriks JumlahBobotDanBiaso

For i As Integer = 0 To jumlahSarafOutput - 1
	JumlahBobotDanBiaso(i) += biaso(i)
Next

5j. Hitung nilai output akhir dengan menggunakan fungsi Softmax untuk masing-masing data pada matriks JumlahBobotDanBiaso
Penjelasan tentang fungsi Softmax akan dijelaskan pada perhitungan dibawah ini (poin 5j1 – 5j3)

Dim hasilSoftMax As Double() = Softmax(JumlahBobotDanBiaso)
Array.Copy(hasilSoftMax, outputs, hasilSoftMax.Length)

Memasuki perhitungan utama pada fungsi Softmax

5j1. 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

5j2. Cari nilai skala

Dim skala As Double = 0.0
For i = 0 To hoJumlahBobotDanBias.Length - 1
	skala += Math.Exp(hoJumlahBobotDanBias(i) - maksData)
Next i

5j3. 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

* Agar dapat menjalankan fungsi PSO diatas, maka diperlukan sebuah Class Partikel untuk menampung semua data data partikel yang berisi posisi, fitness, dan kecepatan partikel. Deklarasi Class Partikel adalah sebagai berikut:

Public Class Partikel
    Public posisi() As Double
    Public fitness As Double
    Public kecepatan() As Double

    Public posisiTerbaik() As Double
    Public fitnessTerbaik As Double

    Public Sub New(ByVal posisi() As Double, ByVal fitness As Double, ByVal kecepatan() As Double, ByVal posisiTerbaik() As Double, ByVal fitnessTerbaik As Double)
        Me.posisi = New Double(posisi.Length - 1) {}
        posisi.CopyTo(Me.posisi, 0)
        Me.fitness = fitness
        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.fitnessTerbaik = fitnessTerbaik
    End Sub
End Class

Hasil akhir adalah: (klik untuk perbesar gambar)

cmd55a

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 *