Algoritma Probit Model (Probability Unit) adalah salah satu algoritma yang digunakan untuk pengelompokan data. Tetapi bisa juga digunakan untuk pengambilan keputusan. Contoh yang dibahas kali ini adalah mengenai penentuan penerimaan pengajuan kredit sepeda motor baru.
Proses perhitungan yang utama pada algoritma ini adalah mencari bobot pada data yang sudah ada. Setelah bobot selesai dihitung, maka nilai bobot tersebut akan digunakan untuk menghitung setiap data baru yang tidak diketahui hasilnya. Teknik yang digunakan pada algoritma ini adalah 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 metode ini juga disebut sebagai Algoritma 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:
Pelanggan | Umur | Jenis Kelamin | Skor Kepribadian | Hasil |
---|---|---|---|---|
Pelanggan A | 44 | Laki-laki | 3.55 | Ditolak |
Pelanggan B | 52 | Perempuan | 4.71 | Ditolak |
Pelanggan C | 60 | Perempuan | 6.56 | Diterima |
Pelanggan D | 56 | Laki-laki | 6.8 | Diterima |
Pelanggan E | 51 | Laki-laki | 6.94 | Ditolak |
Pelanggan F | 46 | Perempuan | 6.52 | Ditolak |
Pelanggan G | 48 | Laki-laki | 4.25 | Ditolak |
Pelanggan H | 58 | Perempuan | 5.71 | Ditolak |
Selanjutnya ada 2 orang pelanggan baru yang mengajukan kredit sepeda motor
Maka tentukan pelanggan ini nantinya akan termasuk dalam kelompok Diterima / Ditolak
Diasumsikan data awalnya adalah sebagai berikut:
Pelanggan | Umur | Jenis Kelamin | Skor Kepribadian |
---|---|---|---|
Pelanggan I | 44 | Perempuan | 12.52 |
Pelanggan J | 55 | Laki-Laki | 6.38 |
Contoh data pelanggan tersebut adalah sebagai berikut:
Untuk Kriteria Jenis Kelamin:
Laki-laki dilambangkan dengan angka -1
Perempuan dilambangkan dengan angka +1
Untuk Kriteria Nilai Hasil:
Diterima dilambangkan dengan angka 1
Ditolak dilambangkan dengan angka 0
Dim data(9)() As Double data(0) = New Double() {44, -1, 3.55, 0} data(1) = New Double() {52, +1, 4.71, 0} data(2) = New Double() {60, +1, 6.56, 1} data(3) = New Double() {56, -1, 6.8, 1} data(4) = New Double() {51, -1, 6.94, 0} data(5) = New Double() {46, +1, 6.52, 0} data(6) = New Double() {48, -1, 4.25, 0} data(7) = New Double() {58, +1, 5.71, 0}
Contoh data pelanggan baru adalah sebagai berikut:
Untuk Kriteria Nilai Hasil, semua dilambangkan dengan nilai -1 karena belum diketahui hasilnya
data(8) = New Double() {44, +1, 12.52, -1} data(9) = New Double() {55, -1, 6.38, -1}
Langkah-langkah penggunaan algoritma ini adalah
1. Lakukan normalisasi data untuk kriteria Umur dan Skor Kepribadian
Normalisasi data dihitung dengan (rumus data – (rata-rata kriteria tersebut)) / standar deviasi kriteria tersebut
Rata-rata adalah jumlah semua data dibagi dengan jumlah datanya
Standar deviasi adalah akar dari ((kuadrat dari (jumlah dari (data – rata-rata))) / jumlah data)
Dim kolom() As Integer = {0, 2} Dim jumlahBaris As Integer = data.Length Dim jumlahKolom As Integer = data(0).Length Dim hasil(1)() As Double ' [0] = rata-rata, [1] = standar deviasi For i = 0 To 1 hasil(i) = New Double(jumlahKolom - 1) {} Next i For c = 0 To jumlahKolom - 1 '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 '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 Next c For c = 0 To kolom.Length - 1 Dim j As Integer = kolom(c) ' kolom yang dinormalisasi Dim mean As Double = hasil(0)(j) ' nilai rata-rata untuk kolom tersebut Dim stdDev As Double = hasil(1)(j) For i = 0 To jumlahBaris - 1 data(i)(j) = (data(i)(j) - mean) / stdDev Next i Next c
2. 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
3. Cari bobot terbaik untuk setiap kriteria pada matriks contohData
Metode pembelajaran yang digunakan adalah metode Simplex Optimization
Langkah-langkah metode Simplex Optimization akan dibahas pada point dibawah ini (point 3a – 3j)
Dim bobotTerbaik() As Double = pc.ProsesPerhitungan(contohData, maksEpoch)
Penjelasan mengenai Metode Simplex Optimization adalah sebagai berikut:
3a. 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(2) As Solution For i = 0 To 2 solusi(i) = New Solution(jumlahKriteria) solusi(i).bobot = CariSolusiAcak() solusi(i).nilaiKesalahan = MeanSquaredError(contohData, solusi(i).bobot) Next i
* Gunakan fungsi ini untuk mencari nilai MSE (Mean Squared Error)
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(ByVal contohData()() As Double, ByVal bobot() As Double) As Double Dim indeksKriteriaHasil As Integer = contohData(0).Length - 1 Dim jumlahKuadrat As Double = 0.0 For i = 0 To contohData.Length - 1 Dim xData(jumlahKriteria - 1) As Double Array.Copy(contohData(i), xData, jumlahKriteria) Dim hasilPerhitungan As Double = hitungNilaiOutput(xData, bobot) Dim hasilData As Double = contohData(i)(indeksKriteriaHasil) jumlahKuadrat += (hasilPerhitungan - hasilData) * (hasilPerhitungan - hasilData) Next i Return jumlahKuadrat / contohData.Length End Function
3b. Urutkan solusi berdasarkan tingkat kesalahan terendahnya, kemudian masukkan nilai bobot terbaik – lainnya – terburuk sesuai urutan yang ada
Array.Sort(solusi) ' [0] = terbaik, [1] = lainnya, [2] = terburuk Dim solusiTerbaik() As Double = solusi(indeksSolusiTerbaik).bobot Dim solusiLainnya() As Double = solusi(indeksSolusiLainnya).bobot Dim solusiTerburuk() As Double = solusi(indeksSolusiTerburuk).bobot
3c. Cari nilai centroid, yaitu nilai tengah dari solusi lainnya ke solusi terbaik
Dim centroid() As Double = Me.Centroid(solusiLainnya, solusiTerbaik)
* Gunakan fungsi ini untuk mencari nilai centroid
Private Function Centroid(ByVal lainnya() As Double, ByVal solusiTerbaik() As Double) As Double() Dim hasil(Me.jumlahKriteria) As Double For i = 0 To hasil.Length - 1 hasil(i) = (lainnya(i) + solusiTerbaik(i)) / 2.0 Next i Return hasil End Function
3d. 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 expanded() As Double = Me.Expanded(centroid, solusiTerburuk) Dim nilaiKesalahanExpanded As Double = MeanSquaredError(contohData, expanded) If nilaiKesalahanExpanded < solusi(indeksSolusiTerburuk).nilaiKesalahan Then Array.Copy(expanded, solusi(indeksSolusiTerburuk).bobot, jumlahKriteria + 1) solusi(indeksSolusiTerburuk).nilaiKesalahan = nilaiKesalahanExpanded Continue Do End If
3e. 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 reflected() As Double = Me.Reflected(centroid, solusiTerburuk) Dim nilaiKesalahanReflected As Double = MeanSquaredError(contohData, reflected) If nilaiKesalahanReflected < solusi(indeksSolusiTerburuk).nilaiKesalahan Then ' relected better than terburuk? Array.Copy(reflected, solusi(indeksSolusiTerburuk).bobot, jumlahKriteria + 1) solusi(indeksSolusiTerburuk).nilaiKesalahan = nilaiKesalahanReflected Continue Do End If
3f. 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 contracted() As Double = Me.Contracted(centroid, solusiTerburuk) Dim nilaiKesalahanContracted As Double = MeanSquaredError(contohData, contracted) If nilaiKesalahanContracted < solusi(indeksSolusiTerburuk).nilaiKesalahan Then Array.Copy(contracted, solusi(indeksSolusiTerburuk).bobot, jumlahKriteria + 1) solusi(indeksSolusiTerburuk).nilaiKesalahan = nilaiKesalahanContracted Continue Do End If
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 Expanded berada pada posisi z, dengan jarak (centroid-buruk) * koefisien gamma, dalam contoh ini bernilai 2.0
Posisi Reflected berada pada posisi y, dengan jarak (centroid-buruk) * koefisien alpha, dalam contoh ini bernilai 1.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(ByVal centroid() As Double, ByVal solusiTerburuk() As Double) As Double() Const gamma As Double = 2.0 Dim hasil(Me.jumlahKriteria) As Double For i = 0 To hasil.Length - 1 hasil(i) = centroid(i) + (gamma * (centroid(i) - solusiTerburuk(i))) Next i Return hasil End Function 'Gunakan fungsi ini untuk mencari nilai reflected Private Function Reflected(ByVal centroid() As Double, ByVal solusiTerburuk() As Double) As Double() Const alpha As Double = 1.0 Dim hasil(Me.jumlahKriteria) As Double For i = 0 To hasil.Length - 1 hasil(i) = centroid(i) + (alpha * (centroid(i) - solusiTerburuk(i))) Next i Return hasil End Function 'Gunakan fungsi ini untuk mencari nilai contracted Private Function Contracted(ByVal centroid() As Double, ByVal solusiTerburuk() As Double) As Double() Const rho As Double = -0.5 Dim hasil(Me.jumlahKriteria) As Double For i = 0 To hasil.Length - 1 hasil(i) = centroid(i) + (rho * (centroid(i) - solusiTerburuk(i))) Next i Return hasil End Function
3g. 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 solusiAcak() As Double = CariSolusiAcak() Dim nilaiKesalahanSolusiAcak As Double = MeanSquaredError(contohData, solusiAcak) If nilaiKesalahanSolusiAcak < solusi(indeksSolusiTerburuk).nilaiKesalahan Then Array.Copy(solusiAcak, solusi(indeksSolusiTerburuk).bobot, jumlahKriteria + 1) solusi(indeksSolusiTerburuk).nilaiKesalahan = nilaiKesalahanSolusiAcak Continue Do End If
3h. 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.
3h1. 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 = 0 To jumlahKriteria solusi(indeksSolusiTerburuk).bobot(j) = (solusi(indeksSolusiTerburuk).bobot(j) + solusi(indeksSolusiTerbaik).bobot(j)) / 2.0 Next j solusi(indeksSolusiTerburuk).nilaiKesalahan = MeanSquaredError(contohData, solusi(indeksSolusiTerburuk).bobot)
3h2. 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 = 0 To jumlahKriteria solusi(indeksSolusiLainnya).bobot(j) = (solusi(indeksSolusiLainnya).bobot(j) + solusi(indeksSolusiTerbaik).bobot(j)) / 2.0 Next j solusi(indeksSolusiLainnya).nilaiKesalahan = MeanSquaredError(contohData, solusi(indeksSolusiLainnya).bobot)
3i. Lakukan perhitungan 3a – 3h sebanyak parameter maksEpoch
3j. Dapatkan solusi terbaik, yaitu solusi dengan nilai kesalahan terendah
Array.Copy(solusi(indeksSolusiTerbaik).bobot, Me.bobot, Me.jumlahKriteria + 1)
4. Lakukan perhitungan dari masing-masing data awal menggunakan matriks bobot yang sudah ditemukan
Dim output As Double = pc.hitungNilaiOutput(contohData(i), bobotTerbaik)
* Gunakan fungsi ini untuk menghitung nilai output
Public Function hitungNilaiOutput(ByVal data() As Double, ByVal bobot() As Double) As Double Dim z As Double = 0.0 z += bobot(0) For i = 0 To bobot.Length - 2 z += (bobot(i + 1) * data(i)) Next i Return HitungDistribusiAkumulatif(z) End Function
5. 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
If output <= 0.5 Then Console.Write("-> Ditolak ") Else Console.Write("-> Diterima") End If
6. 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"))
7. Lakukan perhitungan yang sama (poin 4 dan 5) untuk masing-masing data baru
For i As Integer = 0 To dataBaru.Length - 1 Console.Write("Pelanggan " & Chr(i + 65 + 8) & " ") Dim input(jumlahKolom - 2) As Double Array.Copy(dataBaru(i), input, jumlahKolom - 1) For j = 0 To input.Length - 1 Console.Write(input(j).ToString("F2").PadRight(5) & " ") Next j Console.Write(" ") Dim output As Double = pc.hitungNilaiOutput(dataBaru(i), bobotTerbaik) Console.Write(output.ToString("F4") & " ") If output <= 0.5 Then Console.Write("-> Ditolak ") Else Console.Write("-> Diterima") End If Console.WriteLine("") Next
* Agar dapat menjalankan skrip diatas, maka diperlukan sebuah Class Solution untuk menampung data bobot dan nilai kesalahannya. Deklarasi Class Solution adalah sebagai berikut:
Private Class Solution Implements IComparable(Of Solution) Public bobot() As Double Public nilaiKesalahan As Double Public Sub New(ByVal jumlahKriteria As Integer) Me.bobot = New Double(jumlahKriteria) {} Me.nilaiKesalahan = 0.0 End Sub 'Fungsi untuk mengurutkan nilai kesalahan dari yang terendah (terbaik) ke tertinggi (terburuk) Public Function CompareTo(ByVal lainnya As Solution) As Integer Implements IComparable(Of Solution).CompareTo If Me.nilaiKesalahan < lainnya.nilaiKesalahan Then Return -1 ElseIf Me.nilaiKesalahan > lainnya.nilaiKesalahan Then Return 1 Else Return 0 End If End Function End Class
Hasil akhir adalah: (klik untuk perbesar gambar)
Contoh modul / source code dalam bahasa VB (Visual Basic) dapat didownload disini:
Jika membutuhkan jasa kami dalam pembuatan program, keterangan selanjutnya dapat dilihat di Fasilitas dan Harga
Jika ada yang kurang paham dengan langkah-langkah algoritma diatas, silahkan berikan komentar Anda.
Selamat mencoba.