Showing posts with label penulisan. Show all posts

Algoritma JST (Jaringan Saraf Tiruan) dengan teknik Simplex Optimization adalah salah satu algoritma berbasis jaringan saraf yang dapat d...

Image result for algorithm flat

Algoritma JST (Jaringan Saraf Tiruan) dengan teknik Simplex Optimization 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.
Algoritma ini adalah variasi lain dari Algoritma JST (Jaringan Saraf Tiruan), dimana sistem pencarian matriks bobot yang umum digunakan adalah menggunakan PSO (Particle Swarm Optimization), Back-Propagation, dan EO (Evolutionary Optimization). Pada pembahasan kali ini akan digunakan teknik yang cukup sederhana yaitu Simplex Optimization.
Simplex Optimization bekerja dengan cara membentuk segitiga solusi yang dikatakan sebagai solusi terbaik – lainnya – terburuk. Pada setiap perhitungan, segitiga ini akan dihitung sehingga semakin mendekati solusi yang terbaik. Apabila segitiga ini digambar secara berurutan pada setiap perulangan, gerakan segitiga yang terjadi mirip dengan pola gerakan amoeba, oleh karena itu teknik ini juga disebut sebagai AMO (Amoeba Method Optimization).

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:
PelangganUmurJenis KelaminSkor Kepribadian
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 – 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 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()

    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) {}
    End Sub
 
 . . .
End Class

3. Sebelum masuk ke dalam fungsi utama perhitungan, ada beberapa parameter yang perlu diperhatikan, yaitu:
3a. Tentukan Jumlah maksimal Epoch
Epoch adalah banyak perulangan yang dilakukan dalam 1 kali proses pembelajaran
Diasumsikan dalam kasus ini jumlah maksimal Epoch adalah 100
Const maksEpoch As Integer = 100

4. Lakukan proses pencarian nilai bobot dan bias terbaik
Metode yang digunakan adalah Simplex Optimization
Penjelasan lebih detail tentang fungsi ini dapat dilihat pada penjelasan skrip dibawah ini (poin 4a – 4i)
Dim bobotTerbaik As Double() = jst.Simplex(contohData, maksEpoch)
jst.setBobot(bobotTerbaik)
Memasuki perhitungan utama pada fungsi Simplex
* Inisialisasi jumlah bobot yang digunakan dalam perhitungan
  • 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, banyak data yang diperlukan adalah 12 + 4 + 8 + 2 = 26 buah data
Fungsi ini akan mencari data yang memiliki bobot terendah diantara semua data input, dan akan mengembalikan 26 buah data dengan susunan seperti diatas
Dim jumlahBobot As Integer = (Me.jumlahSarafInput * Me.jumlahSarafTersembunyi) + (Me.jumlahSarafTersembunyi * Me.jumlahSarafOutput) + Me.jumlahSarafTersembunyi + Me.jumlahSarafOutput

4a. Ambil 3 nilai acak untuk dijadikan sebagai solusi sementara, yaitu solusi terbaik, terburuk, lainnya
Untuk masing-masing nilai tersebut, hitung tingkat kesalahannya menggunakan teknik MSE (Mean Squared Error)
yaitu jumlah dari (kuadrat dari (hasil terhitung – hasil pada data awal)) / jumlah data
Dim solusi As Solution() = New Solution(2) {}
For i As Integer = 0 To 2
 solusi(i) = New Solution(jumlahBobot)
 solusi(i).bobot = CariSolusiAcak(jumlahBobot)
 solusi(i).nilaiKesalahan = MeanSquaredError(contohData, solusi(i).bobot)
Next
* 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 perulangan,
Urutkan solusi berdasarkan tingkat kesalahan terendahnya, kemudian masukkan nilai bobot terbaik – lainnya – terburuk sesuai urutan yang ada
Array.Sort(solusi)
Dim bobotTerbaik As Double() = solusi(indeksSolusiTerbaik).bobot
Dim bobotLainnya As Double() = solusi(indeksSolusiLainnya).bobot
Dim bobotTerburuk As Double() = solusi(indeksSolusiTerburuk).bobot

4c. Cari nilai centroid, yaitu nilai tengah dari solusi lainnya ke solusi terbaik
* Gunakan fungsi ini untuk mencari nilai centroid
PArray.Sort(solusi)
Dim bobotTerbaik As Double() = solusi(indeksSolusiTerbaik).bobot
Dim bobotLainnya As Double() = solusi(indeksSolusiLainnya).bobot
Dim bobotTerburuk As Double() = solusi(indeksSolusiTerburuk).bobotrivate Function Centroid(bobotLainnya As Double(), bobotTerbaik As Double()) As Double()
 Dim jumlahBobot As Integer = bobotLainnya.Length
 Dim hasil As Double() = New Double(jumlahBobot - 1) {}
 For i As Integer = 0 To hasil.Length - 1
  hasil(i) = (bobotLainnya(i) + bobotTerbaik(i)) / 2.0
 Next
 Return hasil
End Function

4d. Cari nilai expanded, yaitu nilai centroid ditambah (nilai centroid – nilai terburuk) dikali 2
Kemudian hitung tingkat kesalahannya menggunakan teknik MSE (Mean Squared Error)
Jika nilai kesalahan expanded kurang dari nilai kesalahan terburuk, maka nilai expanded akan menggantikan nilai terburuk
Dim bobotExpanded As Double() = Expanded(bobotCentroid, bobotTerburuk)
Dim nilaiKesalahanExpanded As Double = MeanSquaredError(contohData, bobotExpanded)
If nilaiKesalahanExpanded 
4e. Cari nilai reflected, yaitu nilai centroid ditambah (nilai centroid - nilai terburuk) dikali 1
Kemudian hitung tingkat kesalahannya menggunakan teknik MSE (Mean Squared Error) Jika nilai kesalahan reflected kurang dari nilai kesalahan terburuk, maka nilai reflected akan menggantikan nilai terburuk
Dim bobotReflected As Double() = Reflected(bobotCentroid, bobotTerburuk)
Dim nilaiKesalahanReflected As Double = MeanSquaredError(contohData, bobotReflected)
If nilaiKesalahanReflected 
4f. Cari nilai contracted, yaitu nilai centroid ditambah (nilai centroid - nilai terburuk) dikali - 0.5 Kemudian hitung tingkat kesalahannya menggunakan teknik MSE (Mean Squared Error) Jika nilai kesalahan contracted kurang dari nilai kesalahan terburuk, maka nilai contracted akan menggantikan nilai terburuk
Dim bobotContracted As Double() = Contracted(bobotCentroid, bobotTerburuk)
Dim nilaiKesalahanContracted As Double = MeanSquaredError(contohData, bobotContracted)
If nilaiKesalahanContracted 
Gunakan 3 fungsi dibawah ini untuk mencari nilai reflected, expanded, contracted
Ilustrasi singkat adalah sebagai berikut: b----------x----------c----------y----------z buruk-----------------centroid
Tarik garis lurus antara posisi terburuk dengan posisi centroid Kemudian tambahkan garis terusan dari posisi centroid sepanjang jarak sebelumnnya
  • Posisi Reflected berada pada posisi y, dengan jarak (centroid-buruk) * koefisien alpha, dalam contoh ini bernilai 1.0
  • Posisi Expanded berada pada posisi z, dengan jarak (centroid-buruk) * koefisien gamma, dalam contoh ini bernilai 2.0
  • Posisi Contracted berada pada posisi x, dengan jarak (centroid-buruk) * koefisien beta, dalam contoh ini bernilai 0.5
'Gunakan fungsi ini untuk mencari nilai expanded

Private Function Expanded(Centroid As Double(), bobotTerburuk As Double()) As Double()
 Dim jumlahBobot As Integer = Centroid.Length
 Dim gamma As Double = 2.0
 Dim hasil As Double() = New Double(jumlahBobot - 1) {}
 For i As Integer = 0 To hasil.Length - 1
  hasil(i) = Centroid(i) + (gamma * (Centroid(i) - bobotTerburuk(i)))
 Next
 Return hasil
End Function
'Gunakan fungsi ini untuk mencari nilai reflected
Private Function Reflected(Centroid As Double(), bobotTerburuk As Double()) As Double()
 Dim jumlahBobot As Integer = Centroid.Length
 Dim alpha As Double = 1.0
 Dim hasil As Double() = New Double(jumlahBobot - 1) {}
 For i As Integer = 0 To hasil.Length - 1
  hasil(i) = Centroid(i) + (alpha * (Centroid(i) - bobotTerburuk(i)))
 Next
 Return hasil
End Function
'Gunakan fungsi ini untuk mencari nilai contracted

Private Function Contracted(Centroid As Double(), bobotTerburuk As Double()) As Double()
 Dim jumlahBobot As Integer = Centroid.Length
 Dim rho As Double = -0.5
 Dim hasil As Double() = New Double(jumlahBobot - 1) {}
 For i As Integer = 0 To hasil.Length - 1
  hasil(i) = Centroid(i) + (rho * (Centroid(i) - bobotTerburuk(i)))
 Next
 Return hasil
End Function
4g. Cari nilai acak lagi Kemudian hitung tingkat kesalahannya menggunakan teknik MSE (Mean Squared Error) Jika nilai kesalahannya kurang dari nilai kesalahan terburuk, maka nilai ini akan menggantikan nilai terburuk
Dim bobotSolusiAcak As Double() = CariSolusiAcak(jumlahBobot)
Dim nilaiKesalahanSolusiAcak As Double = MeanSquaredError(contohData, bobotSolusiAcak)
If nilaiKesalahanSolusiAcak 
4h. Jika nilai kesalahan dari posisi expanded - reflected - contracted - solusi acak tidak ada yang kurang dari nilai kesalahan solusi terburuk, Maka hitung nilai solusi lainnya dan solusi terburuk yang baru.
4h1. Hitung nilai solusi terburuk yang baru, yaitu (nilai terburuk + nilai terbaik) dibagi 2 Kemudian hitung tingkat kesalahannya menggunakan teknik MSE (Mean Squared Error)
For j As Integer = 0 To jumlahBobot - 1
 bobotTerburuk(j) = (bobotTerburuk(j) + bobotTerbaik(j)) / 2.0
Next
solusi(indeksSolusiTerburuk).nilaiKesalahan = MeanSquaredError(contohData, bobotTerburuk)
4h2. Hitung nilai solusi lainnya yang baru, yaitu (nilai lainnya + nilai terbaik) dibagi 2 Kemudian hitung tingkat kesalahannya menggunakan teknik MSE (Mean Squared Error)
For j As Integer = 0 To jumlahBobot - 1
 bobotLainnya(j) = (bobotLainnya(j) + bobotTerbaik(j)) / 2.0
Next
solusi(indeksSolusiLainnya).nilaiKesalahan = MeanSquaredError(contohData, bobotLainnya)
4i. Dapatkan solusi terbaik, yaitu solusi pada indeks terbaik
Me.setBobot(solusi(indeksSolusiTerbaik).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 SetBobotAwal, 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
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
 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 maka
  • 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)  Ditolak   ")
 If 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
  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)  Ditolak ")
 Else
  Console.Write("-> Diterima")
 End If
 Console.WriteLine("")
Next
* Agar dapat menjalankan fungsi Simplex diatas, maka diperlukan sebuah Class Solution untuk menampung semua data bobot dan nilai kesalahan solusi tersebut. Deklarasi Class Solution adalah sebagai berikut:

Private Class Solution
 Implements IComparable(Of Solution)
 Public bobot As Double()
 Public nilaiKesalahan As Double

 Public Sub New(jumlahBobot As Integer)
  Me.bobot = New Double(jumlahBobot - 1) {}
  Me.nilaiKesalahan = 0.0
 End Sub

 'Fungsi untuk mengurutkan nilai kesalahan dari yang terendah (terbaik) ke tertinggi (terburuk)
 Public Function CompareTo(other As Solution) As Integer Implements IComparable(Of Solution).CompareTo
  If Me.nilaiKesalahan  other.nilaiKesalahan Then
   Return 1
  Else
   Return 0
  End If
 End Function
End Class
Hasil akhir adalah: (klik untuk perbesar gambar)

Mobilitas Tinggi Hal pertama yang membuat Phoenix begitu jago adalah  skill  bernama Icarus Dive.  Skill  ini bisa digunakan untuk member...

Mobilitas Tinggi

Hal pertama yang membuat Phoenix begitu jago adalah skill bernama Icarus Dive. Skill ini bisa digunakan untuk memberi damage dan melambatkan gerakan musuh, tapi lebih dari itu Icarus Dive adalah alat mobilitas yang sangat penting. Hero support di Dota 2 biasanya punya mobilitas rendah dan harus beli Blink Dagger atau Force Staff, tapi Phoenix punya “blink” gratis sejak level satu.
Dengan Icarus Dive, kamu jadi sangat sulit kena gank sehingga jarang mati. Kamu juga bisa melakukan berbagai manuver kreatif sambil Dive, seperti menaruh ward, membeli barang di Secret Shop, creep stacking, sampai mengambil rune. Hanya stun atau silence yang bisa menghentikanmu, tapi itu sih berlaku untuk semua hero.
Dota 2 | Screenshot 2

Gaya Permainan Serba Guna

Permainan Phoenix termasuk unik karena dia bisa dimainkan dengan setidaknya dua gaya berbeda yang sangat berlawanan. Ada yang lebih suka memaksimalkan Icarus Dive di awal, lalu bertindak sebagai inisiator serangan. Tapi ada juga yang memilih memaksimalkan Sun Ray lalu bermain sebagai healer sekaligus damage dealer yang kuat.
Keduanya sama-sama gaya bermain yang valid, tergantung selera saja kamu mau memilih yang mana. Saat fase laning pun Phoenix termasuk versatile (serba guna) berkat skill Fire Spirits miliknya. Kamu bisa menggunakan Fire Spirits untuk menggagalkan last hit musuh, atau untuk menjaga carry temanmu dari harass di safelane.
Dota 2 | Screenshot 3
Fire Spirits bisa jadi senjata untuk bertarung di middle lane.

Tidak Tergantung Item

Sudah jadi hal lumrah apabila hero support tidak begitu tergantung item, tapi mungkin Phoenix adalah hero yang paling tidak butuh item di antara semua hero. Cukup dengan dua item super murah yaitu Tranquil Boots dan Urn of Shadow saja kamu sudah bisa berkontribusi besar di pertarungan. Asal kamu main dengan benar, tentunya.
Nyaris tidak punya core item artinya kamu bisa konsentrasi menghabiskan uang untuk mengonter hero musuh. Belilah Heaven’s Halberd untuk melawan hero tipe right clicker, atau Pipe of Insight untuk melawan serangan magic. Bila kamu ingin main lebih agresif, Veil of Discord dan Shiva’s Guard bisa jadi pilihan.
Dota 2 | Screenshot 4
Phoenix di Warcraft III DotA.

Tetap Relevan Sampai Late Game

Hero support cenderung berkurang kegunaannya di late game, tapi tidak demikian dengan Phoenix. Icarus Dive serta Fire Spirits selalu berguna untuk melambatkan gerakan atau kecepatan serangan musuh, dan Supernova juga tetap jadi alat stun atau utility yang kuat. Tapi alasan sebenarnya Phoenix tetap jago di late game adalah skill ketiganya yaitu Sun Ray.
Sun Ray sering kali diremehkan, padahal skill ini punya damage yang cukup luar biasa. Damage Sun Ray tidak menggunakan angka tetap, tapi dihitung berdasarkan persentase HP musuh. Sun Ray level maksimum bisa memberikan pure damage sampai 45 persen HP, sambil sekaligus menyembuhkan teman sebesar 22,5 persen HP.
Dota 2 | Screenshot 5
Sun Ray, menyerang sambil menyembuhkan.
Damage sebesar ini membuat keberadaan Phoenix sangat berbahaya saat clash, apalagi untuk musuh yang punya mobilitas rendah. Kalau clash berjalan lama, kamu bahkan bisa menggunakan Sun Ray lebih dari sekali berkat skill Supernova.

Sinergi dengan Banyak Hero Lain

Phoenix adalah tipe hero yang kurang jago bila sendirian, tapi dahsyat bila bersama hero lain. Apabila ada teman setimmu yang punya skill untuk mengunci gerakan musuh, Phoenix bisa menggunakan Sun Ray maupun Supernova dengan tenang dan menghasilkan damage maksimal. Jadi bisa dibilang Phoenix adalah hero yang sangat berorientasi pada team fight.
Dota 2 | Screenshot 6
Combo Phoenix dan Sand King yang sukses.
Tentu saja kalau kamu merasa sudah cukup jemawa, kamu bisa main solo (atau YOLO) dengan beli Blink Dagger dan Dagon seperti Dendi (pemain profesional Dota 2), tapi untuk kondisi normal sih jangan ya. Gunakan Phoenix bila di timmu ada Faceless Void, Legion Commander, atau hero-hero stunner. Ingat, jangan sampai kamu Dive ke dalam Chronosphere, nanti kamu diomeli semua orang.

Gaya Nomor Satu, Skill Belakangan

Inilah alasan paling penting untuk menggunakan Phoenix: bentuknya keren! Kapan lagi kamu bisa merasakan menjadi burung abadi yang dapat berubah jadi meteor? Ditambah lagi kamu bisa menukik di medan tempur sambil membakar musuh bagai mobil Tamiya yang muncul di film kartun. Rasa keren yang ditimbulkan jauh lebih tinggi dibanding memainkan “boring medieval dude” semacam Dragon Knight atau Sven.
Dota 2 | Screenshot 7
Tampilan Phoenix di Dota 2 versi alpha.
Mungkin saking kerennya Phoenix, sampai-sampai hingga sekarang belum ada satu pun kostum untuk Phoenix di Dota 2. Semoga saja di The International berikutnya kita dapat kesempatan untuk melakukan voting agar Phoenix dapat kostum, apalagi kostum kelas Arcana. Kalau itu terjadi, sepertinya saya harus menggenggam erat-erat dompet saya agar tidak melayang.

Halo kali ini ane bakal Share Cara mendapat MMR yang tinggi saat TBD di DOTA 2 Reborn. Nah Banyak yang salah sangka cuma TBD Game yang me...

Halo kali ini ane bakal Share Cara mendapat MMR yang tinggi saat TBD di DOTA 2 Reborn.
Nah Banyak yang salah sangka cuma TBD Game yang mempengaruhi MMR akhir saat Calculating. padahal, MMR yang akan kalian dapat dipengaruhi dari first match kalian.
Dari Pengalaman ane, MMR yang yang bakal kalian dapat dipengruhi dari faktor2 berikut :
  • GPM/XPM
  • K/D/A
  • Win Rate
  • Hero Damage

  1. GPM/XPM
GPM/XPM sangat mempengaruhi. dalam hal ini, kalian harus dapet GPM/XPM yang tinggi di setiap match yang kalian mainin. minimal 560 GPM. kalo role kalian support, usahain dapet XPM yang gede udah cukup.


     2. K/D/A ( Kill / Death / Assist )

Dalam Setiap Match yang kalian mainin, usahakan ntuk dapat K/D/A yang bagus. maksud ane, perbedaan Kill, Death dan Assist Haruslah Baik. Misalnya Kill 20% Death 10% Assist 17%. Kalau kalian main carry, pasti bakal dapet Kill yang lumayan banyak sedangkan kalo kalian main support pasti assist yang bakal banyak, itu ga masalah, asalkan presentase KILL dan ASSIST usahakan diatas DEATH.


    3.Win Rate

Untuk Win rate, emang sedikit susah kalau main di normal match apalagi solo play. jadi, kalau team kalian pada egois ( biasanya bakal pick all carry ) usahakan pick sesuai kebutuhan team. kalo kalian bisa ngangkat game sih ga masalah asal kalian tau gimana cara menangin game tersebut. nah, sebelum TBD, usahakan lo dapet setidaknya 60% win rate.


    4. Hero Damage

Nah disini bakal kelihatan gimana cara main kalian . setidaknya, kalo kalian emang guna di team, pasti kalian bakal ngasilin hero damage yang gede ke musuh, dalam hal ini adalah total damage yang kalian kasi ke musuh dari awal game sampe akhir.

Setidaknya, 4 poin diatas haruslah kalian dapetin sebelum TBD Game. Nah Saat TBD Game, usahakan kalian main yang baik. kalau dulu, TBD masih ditentuin dari 4 poin diatas, kalo sekarang, TBD udah ditentuin darin Win / Lose Kalian. Jadi saat TBD usahakan bermain agar menang.



Nah kalau kalian pengen liat stats kalian main kayak gimana, kalian bisa check disini : http://dotabuff.com. tapi sebelumnya kalian harus enable expose public match data pada Dota kalian untuk bisa menggunakan fitur dotabuff.com


nah jika sudah, buka dotabuff.com disana, coba kalian liat di bagian match, kalo match kalian ada di bagian normal match, artinya rata2 permainan kalian masih ada diantara 2k - 3k. 
saran ane sebaiknya jangan main TBD dulu. jadi mainlah TBD saat kalian berada pada Very High Skill Brackets. jika kalian buka TBD saat rata2 match kalian berada di Normal Skill, maka First Game TBD kalian pasti berada di rata2 3k MMR.


Skill Brackets di DOTA2BUFF Artinya :



  • Normal Skill - sekitar 2,500 to 3,000 MMR* Gameplay
  • High Skill - sekitar 3,000 MMR to 3,500 MMR* Gameplay
  • Very High Skill - 3,500 + MMR* Gameplay




  • Nah sekian tips dari ane, setidaknya kalian bakal dapet paling kecil 3k mmr tapi balik lagi dari cara kalian main, dari pengalaman ane, ane bisa dapet 4,8k MMR dari cara diatas.
    nah sekian tips dari ane, kalo ada pertanyaan langsung aja di kolom komentar pasti ane jawab.
    Thanks 

    Tentu saja ini tidak kita rekomendasikan bagi kamu yang kuota internetnya unlimited, karena update dari Microsoft cukup penting (kadang per...

    Tentu saja ini tidak kita rekomendasikan bagi kamu yang kuota internetnya unlimited, karena update dari Microsoft cukup penting (kadang perbaikan bugs, peningkatan fungsionalitas fitur, atau patch security). Tetapi bagi kamu yang kuota internetnya kembang-kempis, boleh mengikuti trik ini.

    Cara Halus #1 — Menggunakan Defer Upgrade

    Pertama khusus bagi kamu pengguna Windows 10 Pro, kamu bisa mematikan automatic update secara halus melalui opsi Defer Upgrade.
    Defer Upgrade artinya meminta Windows 10 untuk tidak mendownload dan menginstall update dalam jangka waktu hingga maksimal 8 bulan.
    Kelebihan Defer Upgrade, kamu bakal tetap akan mendapatkan patch security sehingga Windows 10 kamu tetap aman, tetapi untuk update berupa fitur baru dan peningkatan fitur bakal tidak didownload sehingga kuota kamu bisa lebih hemat.
    Nantinya kamu tinggal matikan Defer Upgrade dan melakukan Check Updates begitu terhubung dengan koneksi berkuota melimpah. Simple sekali khan?
    Untuk mengaktifkan Defer Upgrade, buka Windows Update > Advanced Options
    5 Cara Mematikan Automatic Update di Windows 10 Secara Paksa (Demi Menghemat Kuota Internet) — Tips #15

    Setelah itu tinggal centang aja Defer Upgrade.
    5 Cara Mematikan Automatic Update di Windows 10 Secara Paksa (Demi Menghemat Kuota Internet) — Tips #15
    Tetapi ingat, opsi ini hanya ada di Windows 10 Pro saja. Bagi kamu pengguna Windows 10 Home tidak bisa melakukan cara halus ini.

    Cara Halus #2 — Menggunakan Metered Connection

    Cara halus lainnya adalah mengatur koneksi sebagai metered connection, dengan begitu Windows tidak akan mendownload update sampai kamu terhubung ke koneksi yang non-metered.
    Namun cara ini hanya bisa dilakukan oleh pengguna Windows 10 yang menggunakan koneksi WiFi atau Mobile Broadband.
    Untuk melakukannya cukup buka Settings dengan menekan CTRL + I > Network & Internet
    5 Cara Mematikan Automatic Update di Windows 10 Secara Paksa (Demi Menghemat Kuota Internet) — Tips #15

    Setelah itu pilih koneksi WiFi atau Mobile Broadband kamu > Advanced Options > dan akutfkan opsi Set as metered connection.
    5 Cara Mematikan Automatic Update di Windows 10 Secara Paksa (Demi Menghemat Kuota Internet) — Tips #15
    5 Cara Mematikan Automatic Update di Windows 10 Secara Paksa (Demi Menghemat Kuota Internet) — Tips #15

    Cara Paksa #3 — Mematikan Services Windows Update

    Dengan cara ini Windows Update akan mati total, termasuk juga update untuk patch security. Jadi pastikan jika kamu menggunakan cara ini, begitu terhubung ke internet dengan kuota melimpah segera lakukan update agar Windows kamu tetap secure dan optimal.
    Untuk mematikan automatic update di Windows 10 dengan cara mematikan services nya, langsung saja buka Services.
    5 Cara Mematikan Automatic Update di Windows 10 Secara Paksa (Demi Menghemat Kuota Internet) — Tips #15

    Setelah itu cari Windos Update > Klik kanan > Properties
    5 Cara Mematikan Automatic Update di Windows 10 Secara Paksa (Demi Menghemat Kuota Internet) — Tips #15

    Setelah itu Stop Windows Update Services tersebut dan ubah opsi Startup type ke Disabled.
    5 Cara Mematikan Automatic Update di Windows 10 Secara Paksa (Demi Menghemat Kuota Internet) — Tips #15

    NB: Mematikan Windows Update Services bisa membuat kamu tidak bisa menggunakan Store dan tidak bisa mendownload Modern Apps. Resiko ditanggung penumpang.

    Cara Paksa #4 — Modifikasi Melalui Group Policy

    Cara ini hanya bisa dilakukan oleh pengguna Windows 10 Pro yang memiliki akses terhadap Group Policy. Cukup buka Run dengan Win + R > ketikkan gpedit.msc > Enter
    5 Cara Mematikan Automatic Update di Windows 10 Secara Paksa (Demi Menghemat Kuota Internet) — Tips #15

    Browse ke Computer Configuration > Administrative Templates > Windows Components > Windows Update.
    Lalu klik kanan Configure Automatic Update > Edit
    5 Cara Mematikan Automatic Update di Windows 10 Secara Paksa (Demi Menghemat Kuota Internet) — Tips #15

    Setelah itu pilih opsi Enabled dan ubah automatic updating configuration ke Notify for download and notify for install > OK dan Apply
    5 Cara Mematikan Automatic Update di Windows 10 Secara Paksa (Demi Menghemat Kuota Internet) — Tips #15


    Dengan begitu jika ada update yang dirilis, Windows 10 tidak akan langsung download, melainkan akan memberi notifikasi terlebih dahulu.

    Cara Paksa #5 — Melalui Command PowerShell

    Sebenarnya ini merupakan shortcut dari cara paksa #3, hanya saja kita buat dalam bentuk powershell command agar kamu bisa mengaksesnya dengan lebih cepat.
    Untuk mematikan Windows Update service, cukup buka PowerShell dan eksekusi command berikut ini:
    stop-service wuauserv
    set-service wuauserv –startup disabled
    Untuk memastikan services sudah benar-benar mati, periksa dengan command ini.
    get-wmiobject win32_service –filter “name=’wuauserv'”
    Jika sudah mati maka StartMode nya adalah Disabled dan State nya Stopped.
    Untuk menghidupkan Windows Update service lagi, cukup eksekusi command ini
    set-service wuauserv –startup manual
    start-service wuauserv

    Bonus: Mengembalikan Settings Windows Update Lawas

    Tips ini merupakan tambahan dari techten128 melalui kolom komentar. Dengan oprek registry ini kamu bakal bisa mengembalikan settings Windows Update lawas, sehingga bisa mematikan fitur automatic update di Windows 10.
    • Buka Registry Editor dengan Win + R > ketik regedit > Enter
    • Browse ke key HKEY_LOCAL_MACHINE\SOFTWARE\Policies\Microsoft\Windows
    • Di key Windows, klik kanan > New > Key > beri nama WindowsUpdate
    • Di key WindowsUpdate, lakukan lagi klik kanan > New > Key > beri nama AU
    • Klik kanan di key AU yang dibuat tadi, buat DWORD value dengan nama NoAutoUpdate
    • Klik dua kali di key NoAutoUpdate, set menjadi 1. Klik OK.
    • Tutup Registry Editor. Buka Settings > Update & security > Windows Update, klik check for updates agar perubahan registry tadi bisa langsung diterapkan.
    Kalo berhasil, nanti seperti gambar ini:
    5 Cara Mematikan Automatic Update di Windows 10 Secara Paksa (Demi Menghemat Kuota Internet) — Tips #15